《计算机网络课程设计报告--基于TCP的网络聊天室系统.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告--基于TCP的网络聊天室系统.docx(24页珍藏版)》请在第一文库网上搜索。
1、计算机网络课程设计报告基于TCP的网络聊天室系统一、问题描述题目:基于TCP的网络聊天室系统。在JAvA中,基于TCP协议实现网络通信的类有两个:在客户端的Socket类和服务器端的SeverSocket类。SeverSocket类的功能是建立一个Sever,并通过accentO方法随时监听客户端的连接请求。二、概要设计(抽象数据类型定义).*;importjava.io.*;pub1icc1assNode/用户链表结点Stringusername=nu11;/用户昵称Socketsocket=nu11;ObjectInputStreaminput=nu11;ObjectOutputstrea
2、moutput=nu11;Nodenext=nu11;流程图:Ou1pucStrvmScSOCkeu)StfvcrSockct三、详细设计(主要算法和函数间的调用关系)(1) Node,java用户链接结点,包含用户名、SoCket接口输入输出流和保存下一个用户结点的“指针”.*;importjava.io.*;pub1icc1assNode/用户链表结点Stringusername=nu11;Socketsocket=nu11;ObjectInputStreaminput=nu11;ObjectOutputstreamoutput=nu11;Nodenext=nu11;)(2) User1i
3、nk1ist.java对用户链表的操作,有添加用户、删除用户、根据用户名查找用户和根据索引查找用户。pub1icc1assUser1ink1ist用户链表操作Nodehead;Nodepointer;intcount;pub1icUSer1ink1iSt()构造用户链表head=newNode();head.next=nu11;pointer=nu11;count=0;pub1icvoidaddUser(Noden)/添力U用户pointer=head;whi1e(pointer.next!=nu11)pointer=pointer.next;)pointer.next=n;n.next=nu
4、11;count+;pub1icvoidde1User(Noden)/删除用户pointer=head;whi1e(pointer.next!=nu11)if(pointer.next=n)pointer.next=n.next;count;break;)pointer=pointer.next;)pub1icintgetCount()/返回用户数returncount;pub1icNodefindUser(StringUSername)/根据用户名查找用户if(count=0)returnnu11;pointer=head;whi1e(pointer.next!=nu11)pointer=p
5、ointer.next;if(pointer.username.equa1sIgnoreCase(username)returnpointer;)returnnu11;)pub1icNodefindUser(intindex)/根据索弓查找用户if(count=O)returnnu11;if(countO)returnnu11;pointer=head;inti=O;whi1e(iindex+1)if(pointer.next!=nu11)pointer=pointer.next;e1sereturnnu11;i+;)returnpointer;)(3) ChatSever.java服务器端的
6、主程序,主要是服务器端的界面的和一些功能按钮,包括用户列表窗口、消息窗口、端口设置按钮、启动服务按钮、停止服务按钮和退出程序按钮。设置端口的功能是弹出一个对话框,在对话框架中改变端口再保存,所以设置端口对话框要在另一个类中实现,主程序中要把端口号定义为静态变量,可以让其他类以静态的方式引用。启动服务就是生成一个SeVerSOCket实例对象,初始化用户链表,调用监听客户端的连接请求的线程类。按下停止服务按钮,首先要向所有用户发送“服务关闭”信息,然后再关闭所有SoCket接口和输入输出流。在退出程序之前,也要经过停止服务这个阶段。importjava.awt.*;importjava.awt.
7、event.*;importjavax.swing.*;.*;pub1icc1assChatServerimp1ementsAction1istenerpub1icstaticintport=6666;服务端的侦听口ServerSocketSerVerSoCket;服务端SocketJFrameframe;JMenuBarmenubar;建立菜单栏JMenuSerViCemenu;建立菜单组建立菜单项JMenu1temPOrtiIen1;端口设置JMenu1temStartiten);启动服务JMenu1temStOPiIeni;停止服务JMenu1temexititem;退出JMenuhe1
8、pmenu;JMenu1temhe1pi1em;帮助J1abe11abe1;JPane1pane1;JScro11Paneuserscro11pane;窗口滚动条JScro11Panemessagescro11pane;窗口滚动条JTextAreaUSerShow;用户列表窗口JTextAreaDiessageshow;消息窗口Dimensionframesize;窗口的尺寸DimensionSCreensize;屏幕的尺寸User1ink1istUSer1inkIist;用户链表Server1istenSerVerIiSIer);/端口侦听pub1icChatServer()frame=ne
9、wJFrame(服务器);Containercontentpane=frame.getContentPane();frame.Set1ayout(newBorder1ayout(5,10);menubar=newJMenuBarO;frame.SetJMenuBar(menubar);Servicemenu=newJMenU(服务器);menubar.add(servicemenu);portitem=newJMenU1IenI(端口设置”);startitem=newJMenU1tein(启动服务”);stopitem=newJMenUIteIn(停止服务”);exititem=newJMe
10、nUIten(退出);servicemenu,add(portitem);servicemenu.add(startitem);servicemenu,add(stopitem);servicemenu,add(exititem);stopitem.SetEnabied(Fa1se);初始时,令停止服务按钮不可用为菜单栏添加事件监听portitem.addction1istener(this);Startitem.addAction1istener(this);stopitem.addAction1istener(this);exititem.addAction1istener(this);h
11、e1pmenu=newJMenu(帮助”);menubar.add(he1pmenu);he1pitem=newJMenU1ten(帮助”);he1pmenu.add(he1pitem);he1pitem.addction1istener(this);1abe1=newJ1abeI(在线人数聊天内容”);contentpane.add(1abe1,Border1ayout.NORTH);usershow=newJTeXtArea(20,10);用户列表窗口usershow.SetEnab1ed(fa1se);userscro11pane=newJScro1IPane添加滚动条(usershow
12、,JScro11Pane.VERTICA1SCRO11BARASNEEDED,JScro1!Pane.HORIZONTA1SCRO11BARAS_NEEDED);contentpane,add(userscro11pane,Border1ayout.WEST);messageshow=newJTeXtArea(20,50);消息窗口messageshow.SetEnab1ed(fa1se);messagescro11pane=newJSCroI1Pane添加滚动条(messageshow,JScro11Pane.VERTICA1SCRO11BARASNEEDED,JScro11Pane.HOR
13、IZONTA1SCRO11BARAS_NEEDED);contentpane,add(messagescro11pane,Border1ayout.CENTER);frame,packO;设置运行时窗口的位置framesize=frame.getSize();screensize=Too1kit.getDefau1tToo1kitO.getScreenSize();intx=(int)(screensize,width-framesize.getWidth()2;inty=(int)(screensize,height-framesize.getHeight()/2;frame.Set1oca
14、tion(x,y);frame.SetResizab1e(fa1se);frame.setVisib1e(true);frame.SetDefau1tcioseOperation(JFrame.EXITONC1OSE);frame.addWindow1istener(newWindowAdapterOpub1icvoidwindo1osing(WindowEvente)StopServiceO;System.exit(0););pub1icvoidactionPerformed(ActionEvente)事件处理Objectobj=e.getSource();if(obj=portitem)newSe1POrt(frame);设置端口e1seif(obj=startitem)StartSerViCe();启动服务e1seif(obj=StoPiteIn)停止服务inti=JOptionPane.ShowConfirniDia1og(frame,真的停止服务吗?”,停止服务,JOptionPane.YESOPTION,JOptionPane.QUESTION.MESSAGE);if(i=JOptionPane.YES.OPTION)StopServiceO;e1seif(obj=exititem)退出intj=JOptionPane.ShowConfirniD