.....计算机网络课程设计报告学生姓名学号班级指导教师设计时间.....目录第一章系统描述1.1设计目的·························31.2系统设计任务·····················31.3系统设计分析······················31.4系统功能分析······················4第二章功能模块结构2.1模块划分·························52.2模块结构图·······················52.1模块功能·························5第三章模块算法实现3.1服务器实现·······················63.2客户端实现·······················9第四章运行结果·······················13第五章课程设计总结·······················17第六章附录6.1参考文献························196.2源代码··························19.....第一章系统描述1.1设计目的1.学习网络编程的知识,掌握网络编程的方法。2.进一步掌握编程思想与编程技巧,做到模块化程序设计,3.强化语言学习,尤其是Java的图形界面与多线程,需反复练习,熟练掌握。1.2系统设计任务聊天室软件的设计与开发:基本要求可以完成群聊、私人聊天,实时发送和显示聊天信息,完成好友列表;进一步要求带表情,附件发送,聊天信息的加密传送,设置黑名单等。学习通信编程Socket接口编程,使用TCP或UDP接口完成信息传送,利用多线程技术实现服务器端的多个TCP连接的建立。1.3系统设计分析一.实现网络聊天室编程,关键在于Socket通信,程序的功能都是在Socket的基础上一层一层增加的。实现Socket通信的基本方法为以下4个步骤。(1)在客户端与服务器端创建相应的ServerSockot/Socket实例。(2)打开连接到Socket的输入输出流(3)利用输入输出流,按照一定的协议(TCP协议)对Socket进行读写操作(4)关闭输入输出流和Socket我们要实现的功能都是在第3步对Socket的输入输出流做相应的操作ServerClientServerSocket(port)Socketsocket=ServerSocket.accept()接收连接Socket(host,port)与服务器建立连接OutputStreamInputStreamOutputStreamInputStreamCloseClose通信过程.....二.因为是多客户端,所以必须用线程进行控制,不同的处理线程为不同的客户服务,主线程只负责循环等待,处理线程负责网络连接,接受客户输入的信息,再做相应的处理。1.4系统功能分析本系统可以通过网络进行聊天,采用客户端服务器模式,所以程序简介清晰易懂,而且用户都是在客户端进行活动,方便对用户的管理,也使得程序运行与差错简单起来。采用了多线程技术,可以做到多人同时在线,提高了系统的性能,增强了系统的实用性。有简单的客户端界面,方便用户使用。采用的是TCP协议,这是可靠的,稳定的协议,这样不会丢失任何包,也就不会丢失任何信息。本系统实现的功能有:1.用户名字登录2.用户之间的群聊3.用户之间的私聊4.动态刷新并显示好友列表5.显示在线人数6.服务器可以显示用户在线状态7.能够退出处理8.用户上下线提醒.....第二章功能模块结构2.1模块划分服务器:Server类模块,ServerHanderson模块,sendallclient模块,sendclientlist模块客户端:Client类模块,ServiceFrame窗口界面模块2.2模块结构图2.3模块功能服务器:1.Server类模块:与客户端建立连接,通过套接字获得名字,在控制端显示提示信息2.ServerHander模块:提供线程管理,实现多用户的管理。针对每一个用户发过来的消息,进行相应处理,再转发给客户。3.Sendallclient模块:给每个用户发送消息。4.Sendclientlist模块:每当有用户上线,更新每个用户的用户列表。客户端:1.Client类模块:与服务端建立连接,用户登录,实现消息的群聊,私聊,用户列表的更新等功能。2.ServiceFrame窗口界面模块:客户端窗口界面,实现用户友好,方便用户使用,在窗口上有消息显示,用户列表,在线人数等视图信息。Server模块Client模块ServerHander模块ServerHander模块ServerHander模块ServiceFrame模块建立连接通信过程.....第三章模块算法实现3.1服务器实现1.Server类模块:创建ServerSocket,在指定端口监听,当有用户登录,接受套接字输入流,显示其登录信息,调用ServerHander线程进行管理。publicServer(intport)throwsIOException{ServerSocketserver=newServerSocket(port);while(true){Socketconn=server.accept();//接收客户端套接字DataInputStreamin=newDataInputStream(conn.getInputStream());Stringwho=in.readUTF();System.out.print(Client+(ip:+conn.getInetAddress()+)+who+进入!+\n);ServerHandercn=newServerHander(who,conn);cn.start();}}2.Sendallclient模块:把msg消息发送给每一个用户。其中allclients是ServerHander的枚举类型,可以指向每一个用户。protectedstaticvoidsendallclient(Stringmsg){synchronized(clientlist){EnumerationServerHanderallclients=clientlist.elements();while(allclients.hasMoreElements()){ServerHanderserh=(ServerHander)allclients.nextElement();try{serh.out.writeUTF(msg);serh.out.flush();}catch(IOExceptionexc){serh.interrupt();}}}}.....3.Sendclientlist模块:更新用户列表,当有新用户上线时,对以前的用户的好友列表,加上这个新用户名字,对于这个新用户,加上所有用户的名字。实现方法是在名字信息后面加上“$”关键字,这样客户端接收到这个关键字时,做相应处理。publicstaticsynchronizedvoidsendclientlist(){for(intj=0;jclientlist.size();j++){ServerHanderallclients1=clientlist.elementAt(j);if(j==clientlist.size()-1)//若是新增用户,把vector中的所有用户都发送过去{for(inti=0;iclientlist.size();i++){ServerHanderallclients2=clientlist.elementAt(i);try{allclients1.out.writeUTF(allclients2.who+$);allclients1.out.flush();}catch(IOExceptionexc){allclients1.interrupt();}}}else{//老用户,只增加新来的用户ServerHanderallclients3=clientlist.lastElement();try{allclients1.out.writeUTF(allclients3.who+$);allclients1.out.flush();}catch(IOExceptionexc){allclients1.interrupt();}}}}4.ServerHander模块:关键模块,与客户端进行消息的交互,相互加关键字,解密关键字,做到上下线提醒,群聊,私聊等功能。创建ServerHander的Vector对象,可以方便用户管理,Vector对象是可变数组,而且支持线程同步,.....适合在网络编程中使用。对用户发送过来的消息通过关键字@进行解析,@前面的字符串为发送的消息,后面的字符串为发送对象,若发送给所有人,则直接发送,若发送给某个人,则在发送的消息后面再加上关键字@,让客户端去解析。有用户下线,发送下线消息,通过‘下线’关键字,可以在客户端更新用户列表。classServerHanderextendsThread{Socketsocket;DataInputStreamin;DataOutputStreamout;Stringwho;protectedstaticVectorServerHanderclientlist=newVectorServerHander();//把用户线程放入可变对象数组publicServerHander(Stringname,Socketsocket)throwsIOException{this.who=name;this.socket=socket;in=newDataInputStream(newBufferedInputStream(socket.getInputStream()));out=newDataOutputStream(newBufferedOutputStream(socket.getOutputStream()));}publicvoidrun(){try{clientlist.addElement(this);//VECTOR中增加新线程sendallclient(who+上线);sendclientlist();//为每一个客户端更新在线用户while(true){Stringmsg=in.readUTF();intindex=msg.lastIndexOf(@);//对客户端发过来的信息做相应的处理Stringstr=msg.substring(index+1,msg.length());//取得发送对象和发送的消息msg=msg.substring(0,index);if(str.equals(所有人)==false){sendallclient(who+对+str+说:+msg+@);//不是发给所有人则增添标记@}elsesendallclient(who+对所有人说:+msg);}}catch(IOExceptione){.....System.out.println(error);}finally{clientlist.removeElement(this);System.out.print(Client+(ip:+socket.getInetAddress()+)+who+退出!+\n);sendallclient(who+下线);try{socket.close();}catch(IOExceptionex){System.out.println(clsing);}}}3.2客户端实现1.ServerFrame窗口界面模块:有一个消息显示文本区域,消息发送框,发送按钮,好友列表下拉框,一条标签用来显示在线人数,文本区域添加在JscrollPane上,这样,无论消息有多长,多宽,都能显示出来,如果没添加的话,消息一多,就显示不出了,这个小细节,很多人都没注意。classServiceFram