基于UDP协议的聊天程序设计报告_第1页
基于UDP协议的聊天程序设计报告_第2页
基于UDP协议的聊天程序设计报告_第3页
基于UDP协议的聊天程序设计报告_第4页
基于UDP协议的聊天程序设计报告_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编号:计算机网络课程设计题目:基于UDP的聊天程序系别:计算机科学与工程学院摘要随着网络技术的发展及人们生活的需求,网络聊天已越来越受到人们的青睐。网络聊天已经成为人们工作生活中传递信息、交流感情的重要工具,给人们带来了很大的方便。本课题是开发一个基于UDP的局域网聊天系统,运用软件工程的设计流程,综合运用数据库编程技术、Windows程序设计技术、网络通讯技术,此网络聊天工具采用客户端/服务器(C/S)模式,客户端采用UDP与服务器连接,客户端与客户端之间通过UDP互相通讯。服务器端具有服务器端口设置,此聊天工具能实现多人聊天功能,适用于局域网使用的网络聊天工具,其操作简单,灵活性好,运行也比较稳定。关键词:网络通讯;客户端/服务器模型;用户数据报协议;套接字1-基本设备往往就成为降低UDP过大通信量的有效工具。数据报拥塞控制协议(DCCP)设计成通过在诸如流媒体类型的高速率UDP流中增加主机拥塞控制来减小这个潜在的问题。从以上特点可知,UDP提供的是无连接的、不可靠的数据传送方式,是一种尽力而为的数据交付服务。四.基于C/S的多客服端相互通信原理分析:在C/S模式中,它是在分散式,集中式,以及分布式基础上发展起来的一种新模型,目前大多数网络通信以及应用都属于这种模型,C/S模式将一个网络事务分为两部分,一部分是客户端(Client),他为用户提供网络请求服务的接口,另一部分是服务端(Server),它负责接受用户对服务的请求,并将这些服务透明的提供给用户,既适用于实际应用的程序,又实用于真正的计算装置,举例来说,我们到饭店吃饭时,要首先提出请求吃什么,属于客户端,饭店服务员根据请求提供相应的服务,属于服务端,至于相应的饭菜是由哪一个厨师来做,则由饭店的服务员去联系,而客户端只需要和服务器打交道就行了,从程序实现上来说,客户端和服务器打交道实际上是两个进程打交道,服务端启动server进程,并等待客户端与其联系,而客户端则启动客户进程和服务器打交道。当服务器进程处理完一个客服进程请求的信息之后,由接着等待其他客户的请求。套接字编程原理分析:图1.1套接字编程原理图注释:socket(),使用前创建一个新的套接字;bind(),将套接字地址与所创建的套接字号联系起来;send()与recv(),数据的发送与接收;closesocket(),关闭套接字。六、概要设计服务器服务器客户机甲客户机乙客户机丙图2.1整体框架设计图服务器端主要实现的功能是启动一个监听的进程,开放自己的端口号为7777,不断的监听是否有新的客服端进程向自己发送连接请求,为每一个主动连接自己的客户端设置一个ID号设置一个threads的容器用来管理客户端的线程。与客户端建立连接,实现socket通信,对于服务器端是先接受数据流然后再发送数据流,客服端发送过来的信息经服务器端然后转发到其他所有的客户端,服务器端相当于中间的桥梁。客户端要求主要实现的功能是建立一个图形的界面,用于显示聊天信息等,并且建立与服务器端的通信,主动的向服务器端发送连接请求,然后对输入文本框注册事件监听并且发送给客服端,不断的监听服务器端发来的信息,然后显示出来。七、详细设计服务器端:创建服务端接口创建服务端接口建立一个seversocket的类svsocket创建一个容器用来管理客户端进程开始监听,监听是否有客户端连接,有的话与其建立连接分配ID监听线程监听端口是否有消息传入如果有的话接收信息再将信息发送到其他的所有的客服端当某客户离开,结束他与其他人的通信为客户端连接创建线程从容器vector中删除该线程表示该线程已经离开聊天室,结束两者之间连接图7.1服务器端整体设计流程图客户端建立一个seversocket的类,并且创建一个vector用来管理客户端的线程,然后就开始检测,如果有客户端请求与服务器连接就与其建立socket连接,创建进程设置ID,告诉其他的客户端有新的客户端接入,然后开始监听所有的客户端线程如果有信息通过端口进入就接受然后再发送给其他客户端,如果有客户端退出,就会告诉其他的客户端并且关闭与该客户端的socket连接,然后在vector里面删除相应的线程。主界面服务器界面,当运行服务器端则出现运行客服端登录心得体会:经过两个星期的学习和实践,我也算是顺利的完成了计算机网络课程设计,同时对计算机网络有一个大致的了解,在实践过程中遇到了很多的困难,感觉自己很难将理论与实践相结合,觉得我们学习的那些知识也派不上用场,通过这次课设,我深刻的认识到实践与理论必须要想结合才能使所学的知识变成可用的,通过自己的努力和老师同学们的帮助,多了一种看待问题的角度;我也发现了我所学知识不扎实,只是走马观花的应付考试,在以后的学习中需要时刻的告诫自己,踏踏实实做好每一步。本次课程设计是利用java语言编写的,虽说自己以前接触过这种语言,但是经过这两周的学习,我受益匪浅。首先,我进一步弄懂了JAVA语言的编程方法和原则,并学会了编写java程序。其次,使我更深层次的理解到JAVA语言是一种面向对象的语言,具有可视化编程的特点且代码具有可移植等特点。本次课程设计是实现一个UDP即时通讯程序。经过编写程序和运行,调试程序,我对java语言有了更深的了解。另外,使我对UDP协议的特点和工作过程有了更深的了解。UDP协议提供无连接的、不可靠的服务。它工作于传输层,是传输层的重要协议之一。最后,UDP协议是利用客户端和服务器端模型来实现传输的。本次课程设计使我明白了知识的重要性,同时也更加懂得实践更不可少。我们要经常把所学的知识运用到实践,这样,才能充分的融会贯通。同时,也使我认识到自己动手能力太差,为我以后的学习和发展提供了一个警钟!本次课程设计的过程中,虽然遇到了不少问题,但最后还是成功的完成了。这次课设对于我而言是有很大的收获,懂得独立寻找资料学习,这是最大的收获,在以后的工作中肯定会面临不懂得问题,有了这次课设的经验,就能够去独立学习并解决困难。主要代码packageserver;importjava.awt.Container;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;import.ServerSocket;import.Socket;importjava.util.ArrayList;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;importjavax.swing.JScrollBar;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;publicclassserverextendsJFrame{privateJTextAreaallmsg;privateJTextFieldcurrnum,totalnum,copyright,chatmsg;privateJButtonsend;privateJScrollPanejs;intnum1,num2,port;/*--num1:当前在线人数num2:总上线人数port:服务端口号--*/privateServerSocketss;ArrayListlists;//存放所有在线用户publicserver(){super("聊天室服务器端");this.setSize(310,660);this.setLocation(200,50);lists=newArrayList();num1=num2=0;port=7777;currnum=newJTextField("当前在线人数:"+num1);currnum.setEnabled(false);totalnum=newJTextField("上线总人数:"+num2);totalnum.setEnabled(false);allmsg=newJTextArea();allmsg.append("系统消息\n");allmsg.setEditable(false);allmsg.setLineWrap(true);//允许自动换行js=newJScrollPane(allmsg);//为JTextArea添加滚动条chatmsg=newJTextField("在此输入系统信息");chatmsg.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){Stringstr=chatmsg.getText().trim();if(!"".equals(str)){sendmsg((newDate()).toLocaleString()+"--系统消息:"+str);chatmsg.setText("");}elseJOptionPane.showMessageDialog(null,"消息不能为空","错误",JOptionPane.OK_OPTION);chatmsg.setText("");/*--发送信息后,将输入栏中的信息清空--*/}});send=newJButton("发送");send.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){Stringstr=chatmsg.getText().trim();if(!"".equals(str)){sendmsg((newDate()).toLocaleString()+"--系统消息:"+str);chatmsg.setText("");}elseJOptionPane.showMessageDialog(null,"消息不能为空","错误",JOptionPane.OK_OPTION);chatmsg.setText("");/*--发送信息后,将输入栏中的信息清空--*/}});addcomponettocontainer();this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventwe){sendmsg("SYSTEM_CLOSED");/*--向客户端发送服务器关闭信息--*/destory();}});start();/*--启动连接服务--*/}publicvoidaddcomponettocontainer(){Containerc=this.getContentPane();c.setLayout(null);currnum.setBounds(20,15,130,20);totalnum.setBounds(155,15,125,20);js.setBounds(10,50,280,500);chatmsg.setBounds(10,560,180,30);send.setBounds(220,560,70,30);copyright.setBounds(10,600,280,20);c.add(currnum);c.add(totalnum);c.add(js);c.add(chatmsg);c.add(send);c.add(copyright);this.setVisible(true);this.setResizable(false);}publicvoidstart(){booleanisStarted=false;/*--用于标记服务器是否已经正常启动--*/try{this.ss=newServerSocket(port);isStarted=true;this.allmsg.append((newDate()).toLocaleString()+"服务器启动@端口:"+port+"\n");while(isStarted){Socketclient=this.ss.accept();/*--监听客户端的连接--*/DataInputStreamin=newDataInputStream(client.getInputStream());Stringname=in.readUTF();useru=newuser();=name;u.socket=client;lists.add(u);//将该用户加到列表中去num1++;num2++;currnum.setText("当前在线人数:"+num1);totalnum.setText("上线总人数:"+num2);this.allmsg.append((newDate()).toLocaleString()+":"++"登录\n");newThread(newClientThread(u)).start();/*--为该用户启动一个通信线程--*/}}catch(IOExceptione){System.out.println("服务器已经启动");System.exit(0);}}classClientThreadimplementsRunnable{useruser=null;booleanisConnected=true;DataInputStreamdis=null;DataOutputStreamdos=null;publicClientThread(useru){this.user=u;try{this.dis=newDataInputStream(this.user.socket.getInputStream());this.dos=newDataOutputStream(this.user.socket.getOutputStream());}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}publicvoidrun(){readmsg();}/*--读取客户的聊天信息--*/publicvoidreadmsg(){while(isConnected){try{Stringmsg=dis.readUTF();if("quit&logout".equals(msg))//当用户关闭客户端窗口时,发送quit字符串表示用户已经退出{num1--;try{this.dis.close();this.dos.close();this.user.socket.close();this.isConnected=false;}catch(IOExceptionioe){ioe.printStackTrace();}finally{this.isConnected=false;if(dis!=null)this.dis.close();if(dos!=null)this.dos.close();if(this.user.socket!=null)this.user.socket.close();}lists.remove(this.user);//从列表中删除该用户currnum.setText("当前在线人数:"+num1);allmsg.append((newDate()).toLocaleString()+":"++"退出\n");}elsesendmsg(msg);}catch(IOExceptione){e.printStackTrace();}}}}/*--将信息进行转发--*/publicvoidsendmsg(Stringmsg){userus=newuser();DataOutputStreamos=null;if(lists.size()>0){for(inti=0;i<lists.size();i++){us=(user)lists.get(i);try{os=newDataOutputStream(us.socket.getOutputStream());os.writeUTF(msg);}catch(IOExceptione){e.printStackTrace();}}}elseJOptionPane.showMessageDialog(null,"当前无用户在线。发送消息失败","失败",JOptionPane.OK_OPTION);}publicvoiddestory(){try{this.ss.close();}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace(); }this.dispose();} publicstaticvoidmain(String[]args) {newserver(); }}packageclient;importjava.awt.*;importjavax.swing.*;importjava.awt.event.*;importjava.io.*;import.*;publicclassclientextendsJFrame{privateJTextFieldname;privateJTextFieldip;privateJButtonok,cancle;publicSocketsocket;publicclient(){super("登录框");this.setSize(400,80);this.setLocation(100,100);name=newJTextField("昵称");ip=newJTextField("");ok=newJButton("登录");cancle=newJButton("取消");ok.addActionListener(newlistenEvent());cancle.addActionListener(newlistenEvent());addcomponettocontainer();this.setDefaultCloseOperation(EXIT_ON_CLOSE);}publicvoidaddcomponettocontainer(){Containerc=this.getContentPane();c.setLayout(null);name.setBounds(10,10,100,30);ip.setBounds(120,10,100,30);ok.setBounds(230,10,70,30);cancle.setBounds(310,10,70,30);c.add(name);c.add(ip);c.add(ok);c.add(cancle);this.setVisible(true);this.setResizable(false);}publicclasslistenEventimplementsActionListener{publicvoidactionPerformed(ActionEventevent){//TODOAuto-generatedmethodstubif(event.getSource()==ok){Stringn=name.getText().trim();Stringi=ip.getText().trim();if("".equals(n)||"".equals(i)){JOptionPane.showMessageDialog(null,"昵称、IP不能够为空!","错误",JOptionPane.OK_OPTION);}else{login(n,i);}}if(event.getSource()==cancle){name.setText("");ip.setText("");}}}publicvoidlogin(Stringname,Stringip){try{socket=newSocket(ip,7777);DataOutputStreamout=newDataOutputStream(socket.getOutputStream());out.writeUTF(name);out.flush();//强制输出缓存中的内容//out.close();newClientFrame(name,socket);destroywindow();}catch(UnknownHostExceptione){JOptionPane.showMessageDialog(null,"找不到主机地址(IP错误/网络故障)!","错误",JOptionPane.OK_OPTION);}catch(IOExceptione){}}publicvoiddestroywindow(){this.dispose();}publicstaticvoidmain(String[]args){newclient();}}packageserver;import.*;publicclassuser{Stringname;Socketsocket;}packageclient;importjava.awt.Color;importjava.awt.Container;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;import.Socket;importjava.util.Date;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JOptionPane;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;publicclassClientFrameextendsJFrame{privateJTextAreaallmsg;privateJTextFieldwelcome,copyright,chatmsg;privateJButtonsend;privateJScrollPanejs;privatebooleanisConnected=true;publicDataOutputStreamout;publicDataInputStreamin;publicSockets=null;Stringnic;/*--保存用户昵称--*//***初始化客户端资源*1.获取从LoginFrame传递过来的参数*2.初始化界面元素*3.初始化通信所需要的资源EG:输入/输出流(DataInputStream/DataOutputStream)**/publicClientFrame(Stringname,Socketsocket){this.setSize(310,660);this.setLocation(290,50);this.setTitle("聊天室客户端<"+name+">");/*--指定窗口的标题--*/this.s=socket;/*--接收从LoginFrame中传递过来的Socket--*/this.nic=name+"说:";welcome=newJTextField("<"+name+">欢迎您来到聊天室",100);welcome.setBackground(Color.blue);welcome.setEnabled(false);copyright=newJTextField("allcopyright@TOP-king");copyright.setEnabled(false);allmsg=newJTextArea();allmsg.setEditable(false);allmsg.append("系统消息:欢迎登录在线聊天室\n");js=newJScrollPane(allmsg);//为JTextArea添加滚动条chatmsg=newJTextField("在此输入聊天信息");chatmsg.addActionListener(newlisten());send=newJButton("发送");send.addActionListener(newlisten());/*--添加事件监听器--*/try{out=newDataOutputStream(s.getOutputStream());in=newDataInputStream(s.getInputStream());}catch(IOExceptione){JOptionPane.showMessageDialog(null,"系统异常","错误",JOptionPane.OK_CANCEL_OPTION);}addcomponettocontainer();/*--当用户关闭窗口时进行相关的处理eg:SocketData(Input/Output)Stream的关闭--*/this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventwe){sendmsg("quit&logout");/*--向服务器端发送关闭信息--*/isConnected=false;destory();/*--销毁窗口资源--*/}});newThread(newlinread()).start();/*--启动读取信息线程--*/}publicvoidaddcomponettocontainer(){Containerc=this.getContentPane();c.setLayout(null);welcome.setBounds(75,10,150,20);js.setBounds(10,50,280,500);chatmsg.setBounds(10,560,180,30);send.setBounds(220,560,70,30);copyright.setBounds(10,600,280,20);c.add(welcome);c.add(js);c.add(chatmsg);c.add(send);c.add(copyright);this.setVisible(true);this.setResizable(false);}classlistenimplementsActionListener{publicvoidactionPerformed(ActionEvente){//TO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论