计算机网络课程设计--简单即时通信.docx
课程设计报告20142015学年第一学期课程名称计算机网络设计题目聊天室一、设计任务与要求错误!未定义书签。二、JAVA语言简介错误!未定义书签。1、组成错误!未定义书签。2、体系错误!未定义书签。3、优势错误!未定义书签。4、虚拟机错误!未定义书签。三、TCP简介及特点原理错误!未定义书签。1. 什么是TCP错误!未定义书签。2. TCP功能错误!未定义书签。3. TCP所提供服务的主要特点错误!未定义书签。4. TCP支持的服务器类型错误!未定义书签。5. TCP的端口号错误!未定义书签。6. TCP协议是如何确保数据传输高可靠性错误!未定义书签。7. TCP的服务流程错误!未定义书签。四、聊天室的设计与实现错误!未定义书签。1、客户机/服务器模式错误!未定义书签。2、系统实现原理错误!未定义书签。3、系统工作流程错误!未定义书签。4、界面设计与功能实现错误!未定义书签。五、课程设计的总结体会错误!未定义书签。参考文献错误!未定义书签。一、设计任务与要求简单的即时通信软件:目的与要求:利用SOCket编程实现点对点通信,工作机制模仿即时通信软件的基本功能,登陆,上线,传递信息等等。分为客户部分和服务器部分两块,客户部分类似一般通信软件例如QQ,服务器部分主要提供客户端用户通信服务。二、JAVA语言简介JaVa是由SunMicrosystems公司于1995年5月推出的Java面向对象程序设计语言(以下简称JaVa语言)和JaVa平台的总称。由JameSGoSIing和同事们共同研发,并在1995年正式推出。用Java实现的HotJava浏览器(支持Javaapplet)显示了JaVa的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持JaVaaPplet。另一方面,JaVa技术也不断更新。(2010年OraCie公司收购了SUN)1、组成Java由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(JaVaAPI)0平台Java平台由Java虚拟机(JavaVirtualMachine,简称JVM)和Java应用编程接口(APPliCationProgrammingInterface,简称APl)构成。JaVa应用编程接口为JaVa应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个JaVa平台之后,Java应用程序就可运行。JaVa平台已经嵌入了几乎所有的操作系统。这样JaVa程序可以只编译一次,就可以在各种系统中运行。JaVa应用编程接口已经从Llx版发展到1.2版。常用的JaVa平台基于JaVal.4,最近版本为JaVal.7。2、体系JaVa分为三个体系J2SE(Java2PlatformStandardEdition,java平台标准版),J2EE(Java2Platform,EnterpriseEdition,java平台企业版),J2ME(Java2PlatformMicroEdition,java平台微型版)。3、优势与传统程序不同,Sun公司在推出Java之际就将其作为一种开放的技术。全球数以万计的Java开发公司被要求所设计的Java软件必须相互兼容。"Java语言靠群体的力量而非公司的力量”是SUn公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。Sun公司对JaVa编程语言的解释是:JaVa编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。Java平台是基于Java语言的平台。这样的平台非常流行。因此微软公司推出了与之竞争的.NET平台以及模仿Java的C#语言。4、虚拟机JaVa虚拟机(JavaVirtualMachine)简称JVMJaVa虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。引入JaVa语言虚拟机后,JaVa语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在JaVa虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。三、TCP简介及特点原理1. 什么是TCPTCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transportlayer)通信协议。在简化的计算机网络OSl模型中,它完成第四层传输层所指定的功能。在因特网协议族(IntemetProtOCOlSUite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(Rn)内未收到确认,那么对应的数据(假设丢失了)将会被重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。首先,TCP建立连接之后,通信双方都同时可以进行数据的传输,其次,他是全双工的;在保证可靠性上,采用超时重传和捎带确认机制。在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。在拥塞控制上,采用慢启动算法。2. TCP功能提供计算机程序间连接、检测和丢弃重复的分组、完成数据报的确认、流量控制和网络拥塞。3. TCP所提供服务的主要特点(1)面向连接的传输;(2)端到端的通信;(3)高可靠性,确保传输数据的正确性,不出现丢失或乱序;(4)全双工方式传输;(5)采用字节流方式,即以字节为单位传输字节序列;(6)紧急数据传送功能。4. TCP支持的服务器类型不管怎样,TCP/IP是一个协议集。为应用提供一些低级功能,这些包括IP、TCP、UDPo其它是执行特定任务的应用协议,如计算机间传送文件、发送电子邮件、或找出谁注册到另外一台计算机。因此,最重要的商业"TCPIP服务有:文件传送FiIeTransfer远程登录Remotelogin计算机邮件Mail网络文件系统(NFS)远程打印(Remoteprinting)远程执行(Renloteexecution)名字服务器(Nameservers)终端服务器(Tenninalservers)5. TCP的端口号TCP段结构中端口地址都是16比特,可以有在065535范围内的端口号。对于这65536个端口号有以下的使用规定:(1)端口号小于256的定义为常用端口,服务器一般都是通过常用端口号来识别的。任何TCP/IP实现所提供的服务都用1023之间的端口号,是由IANA来管理的;(2)客户端只需保证该端口号在本机上是惟一的就可以了。客户端口号因存在时间很短暂又称临时端口号;(3)大多数TCP/IP实现给临时端口号分配10245000之间的端口号。大于5000的端口号是为其他服务器预留的。6. TCP协议是如何确保数据传输高可靠性为了保证可靠性,发送的报文都有递增的序列号。序列号和确认号用来确保传输的可靠性。此外,对每个报文都设立一个定时器,设定一个最大时延。对那些超过最大时延仍没有收到确认信息的报文就认为已经丢失,需要重传。7. TCP的服务流程TCP协议提供的是可靠的、面向连接的传输控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程。TCP提供端到端、全双工通信;采用字节流方式,如果字节流太长,将其分段;提供紧急数据传送功能。尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCPoTCP通过下列方式来提供可靠性: 应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(Segnlent)TCP如何确定报文段的长度。 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒 TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。 既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。 TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)o如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。收方可以分4次接收这80个字节,每次接收20字节。一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。另外,TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。这种对字节流的处理方式与Unix操作系统对文件的处理方式很相似。Unix的内核对一个应用读或写的内容不作任何解释,而是交给应用程序处理。对UniX的内核来说,它无法区分一个二进制文件与一个文本文件。TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN,ACK0这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。第一次握手:建立连接时,客户端发送SYN包(SEQ=X)到服务器,并进入SYN_SEND状态,等待服务器确认。第二次握手:服务器收到SYN包,必须确认客户的SYN(ACkx+D,同时自己也送一个SYN包(SEQ=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=y+1),此包发送完毕,客户端和服务器时入EStabliShed状态,完成三次握手。四、聊天室的设计与实现1、客户机/服务器模式通信的两个应用程序间相互作用的主要模式是客户机/服务器模式,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步。客户机/服务器模式在操作过程中采取的是主动请求方式:首先服务器方要先启动,并根据请求提供相应服务:1)打开通信通道并告知本地主机,它愿意在某一公认地址上接收客户请求;2)等待客户请求到达该端口;3)接收到服务请求,处理该请求并发送应答信号。服务完成后,关闭与客户的通信链路,并终止;4)返回第二步,等待客户请求;5)关闭服务器。客户方:1)打开一通信通道,并连接到服务器所在主机的特定端口;2)向服务器发服务请求,等待并接收应答;3)请求结束后关闭通信通道并终止。由此可知:1)客户与服务器进程的作用是非对称的,因此编码不同;2)服务进程一般是先于客户请求而启动的。只要系统运行,该服务进程一直存在,直到正常终止或被强迫终止。2、系统实现原理聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。整个过程可以分成如下三个阶段连接建立、数据传输和拆除连接。服务器客户端建立服务端监听等待并接受连接向服务端发送连 接请求Connect创建连接套接字发送消息Send发送消息Send接受消息Receive关闭套接字Close接受消息Receive关闭套接字Close图4-1系统实现原理图在整个通信过程中,当某一事件触发时如服务器端异常终止或客户端退出,相应应用框架将收到这些消息,从而自动调用响应函数一般可在try-catch-finally语句中实现该功能。如:在客户端若检测到服务器关闭则有catch(SocketExceptione)/TODO:handleexceptione.printStackTrace();intH=JOptionPane.ShowConfIrmDialog(selfFrame,”与服务器通信出错,请重新登陆!“,“连接失败”,JOptionPane.YES_NO_OPTIONfJOptionPane.ERROR_MESSAGE);if(n=J0ptionPane.YES_OPTION)dispose();而在服务器端则有catch(SocketExceptione)e.printStackTrace();textArea.append(与客户端:,+currentsocket.getInetAddress().getCanonicalHostName()+”失去联系!n");3、系统工作流程服务器端客户端图4-2系统工作流程图首先启动聊天室的服务端,默认打开8888端口,并开始监听。然后启动客户端登陆界面(可启动多个),输入用户昵称、密码等信息,连接服务器。进入聊天室后用户之间可以进行简单的文字聊天。当用户发送信息后,服务器会收到用户发送的信息,然后服务器把收到的信息发送给所有在线用户。这样登入服务器的用户们之间就可以进行简单的文字聊天了。当用户断开连接后,服务器也会显示通知该用户下线。整个聊天室基于java语言编写,利用javaAPI中有关TCP传送控制协议的相关功能。4、界面设计与功能实现图4-3用户登录界面图图4-4服务器未开启实现:为按键“登陆”设置监听器,在监听器动作里面尝试创建指定服务器ip地址与通信端口的SoCket接口,并启动客户端界面。若创建失败则给出提示信息。classLoginActionListenerimplementsActionListenerfprivateJFrameselfFrame;publicLoginActionListener(JFrameselFrame)this.SelfFrame=SelFrame;OverridepublicvoidactionPerformed(ActionEvente)/TODOAuto-generatedmethodstubSystem,out.printin("用户名:+naneField.getText()+"t密码:"+newString(pwdField.getPassword();trySocketsocket=newSocket(,127.0.0.1z8888);/回环测试地址newChatClient(socket,nameField.getText();selfFrame.dispose();catch(UnknownHostExceptione2)/TODO:handleexceptione2.printStackTrace();JOptionPane.ShowConfirmDialog(selfFrame,“找不至IJ指定服务器”);catch(IOExceptione2)/TODO:handleexceptione2.printStackTrace();JOptionPane.showConfirmDialog(selfFramer”与服务器通信出错,请重试!“连接失败”,JOptionPane.OKJDPTION,JOptionPane.ERROR.MESSAGE);)翱天空a区聊天空a区WI天家D区杨晨08:01:58hell。.大家好,我S杨晨。献08:02:25有人在吗?小白08:03:21hello?小白08:03:57理,大家好。杨晨080508小白,果果,欢迎你们t入酮室!«*,*»小白080357喟,大家好。杨昊08:05:08小白,果果欢迎你们加入Kl天室!«*,*»小白08:03:21hello?,卜白08:03:57IS大家好。场景08:05:08小白,果果,欢迎你们加入聊天室!«*_A»你们的计算机网S课设做好了没?|睨际称启IbaI发送|睨称:果果.清|发送|鸵际牙、白I.消口|图4-6多个用户进入聊天室图4-7服务器异常关闭实现:绘制客户端通信界面,并启动如下线程,即从SoCket接口中创建读数据流缓冲区并将读取到的信息显示在通信界面。当服务器关闭时,捕获该异常并显示相关信息。classClientThreadextendsThreadprivateSocketsocket;privateJTextAreaContenArea;publicClientThread(SocketSocketzJTextAreaContentArea)this.Socket=Socket;this.ContenArea=ContentArea;)publicvoidrun()BufferedReaderbr=null;trybr=newBufferedReader(newInputStreamReader(socket.getlnputStream();Stringstr=null;while(str=br.readLine()!=null)System.out.printin(str);ContenArea.append(str+,n);/从服务器接收数据并显示catch(SocketExceptione)/TODO:handleexceptione.printStackTrace();intn=JOptionPane.sbOwConfirniDialog(selfFrame,”与服务器通信出错,请重新登陆!“,“连接失败”,JOptionPane.YES_NO_OPTIONfJOptionPane.ERROR_MESSAGE);if(n=JOptionPane.YESOPTION)dispose();catch(IOExceptione)/TODOAuto-generatedcatchblocke.printStackTrace();聊天室0艮务器端-2015.1.9E-:8888端口IP-127.0.0.108:01:58我是杨晨。08:02:25IP-127.0.0.1小白08:03:21hello?新加入客户端:P-127.0.0.1小白08:03:57嘿,大家好。场晨08:05:08小白,果果,欢迎你们加入聊天室!a_a»图4-8服务器监听结果LiJ聊天室B弗器端一2015.1.9服务器正在监听:8888端口新加入客户端:P-127.0.0.1新加入客户端:P-127.0.0.1新加入客户端:IP-127.0.0.1果果08:22:35大家好。小白08:22:54同好。阿卡08:23:31网速不太好。与客户端:127.001失去联系!实现:首先绘制服务器端界面,然后一直扫描是否有新的客户端接入该服务器的服务端口,若有则启动一个新的服务线程为该客户端进行服务。while(true)Socketsocket=ss.accept();SocketList.add(socket);StringipString=socket.getInetAddress().getHostAddress();string=”新加入客户端:',+',IP-,'+ipString+"n"textArea.append(string);Threadthread=newThread(newServerRunner(socketList,socket);thread.start();)classServerRunnerimplementsRunnableprivateArrayList<Socket>sockets;privateSocketcurrentsocket;publicServerRunner(ArrayList<Socket>sockets,Socketcurrentsocket)super();this.sockets=sockets;this.currentsocket=currentsocket;Overridepublicvoidrun()/TODOAuto-generatedmethodstubBufferedReaderbr=null;try(br=newBufferedReader(newInputStreamReader(currentsocket.getlnputStream();Stringstr=null;while(str=br.readLine()!=null)textArea.append(str+"n");for(SockettempSocket:sockets)PrintWriterpw=newPrintWriter(newOutputStreaniWriter(tempSocket.getOutputStream();pw.printin(str);pw.flush();catch(SocketExceptione)e.printStackTrace();te×tArea.append(,与客户端:"+currentsocket.getInetAddress().getCanonicalHostName()+"失去联系!n);catch(IOExceptione)e.printStackTrace();)原则上,在设计的过程中,当掌握了核心思想内容,成功完成功能实现后,界面设计便成为相当重要的一部分。一个好的界面会让使用者方便操控,让功能更直观的实现,也会给人们良好的视觉冲击。五、课程设计的总结体会经过近一周时间的不屑努力与刻苦钻研(虽然在此期间也有考试需要复习),我终于实现了课设的基本要求,当然由于种种限制,该设计并不完善,如想加入聊天室的用户,不能查看聊天室中是否有人,及其通话记录等。但在这段不长的时间里,我确实学到很多东西。尤其是对TCP/IP协议的原理和功能加深了理解。我也学习和了解了有关java语言中SWing图形用户界面、SoCket编程、线程处理等相关知识和应用。这不仅巩固了我的理论知识,也增强了我的动手能力,对知识的理解不再局限于表面,理解更加透彻。只是通过学习课本知识,并不能完全掌握对应知识,但通过课程设计,将各方面的知识综合起来,虽然难度是加大了,但经过自学、查找资料、向同学请教等逐渐实现该设计,最终基本完成课设要求则是对我们能力的提升产生了不可估量的作用。当然在这次课程设计中,我也得到了不少同学的指点和帮助,他们不厌其烦地给我讲解甚至是很简单的问题,让我幡然顿悟。再此对他们表示衷心的感谢!参考文献1单兴华,邱加永,徐明华JaVa基础与案例开发详解出1.清华大学出版社,20122何月顺.双语版Java程序设计M.电子工业出版社,2012.19