基于UDP协议网上聊天程序(共18页)

上传人:2127513****773577... 文档编号:61702103 上传时间:2022-03-12 格式:DOCX 页数:18 大小:534.36KB
收藏 版权申诉 举报 下载
基于UDP协议网上聊天程序(共18页)_第1页
第1页 / 共18页
基于UDP协议网上聊天程序(共18页)_第2页
第2页 / 共18页
基于UDP协议网上聊天程序(共18页)_第3页
第3页 / 共18页
资源描述:

《基于UDP协议网上聊天程序(共18页)》由会员分享,可在线阅读,更多相关《基于UDP协议网上聊天程序(共18页)(18页珍藏版)》请在装配图网上搜索。

1、精选优质文档-倾情为你奉上计算机网络课程设计说明书题 目: 基于UDP协议网上聊天程序 学 院: 计算机科学与工程学院 专 业: 信息安全 姓 名: 学 号: 指导教师: 孙晋永 目录1 协议介绍和使用说明1.1 协议内容本课程设计主要是基于UDP的并用Java实现的简单的聊天程序。UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的。UDP 在传送数据之前不需要先建立连接。对方的运输层在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 是一种最有效的工作方式。虽然UDP 用户数据报只能提供不可靠的交付,但 UDP 在某些方面有其特殊的优点,

2、它有即时通信的功能。比如说,使用聊天程序聊天的时候,省去的了跟对方通信的时候的链接的麻烦,直接进行通信。UDP 只在 IP 的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。UDP 是面向报文的。UDP 没有拥塞控制,很适合多媒体通信的要求。UDP 支持一对一、一对多、多对一和多对多的交互通信。发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文

3、。接收方 UDP 对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。 图1.1UDP基本工作过程1.2 关键技术1.2.1 服务器端Socket的实现Socket又称作套接字,它是使用标准Unix文件描述符(filedescriptor)和其它程序通讯的方式。使用send()和recv()让你更好的控制数据传输。在Java 网络编程中,socket相当于应用程序的港口码头;在计算机网络中,套接字由ip地址和端口号组成,为进程之间通信提供地址。两个主机进行通信实际上就是两个主机中的应用进程互相通信,应用进程之间的通信又称为端到端的通信。

4、为应用进程之间的通信提供运输服务的是运输层的运输协议,运输层需要有两种不同的运输协议,即面向连接的TCP和无连接的UDP。 在Java中,用于实现基于UDP的聊天程序,使用两个重要的类(DatagramSocket类和DatagramPacket类)。DatagramSocket类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。 在DatagramSocket上总是启用UDP广播发送。为了接收广播包,应该将 DatagramSocke

5、t绑定到通配符地址。在某些实现中,将DatagramSocket绑定到一个更加具体的地址时广播包也可以被接收。atagramPacket类表示数据报包。 数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。服务程序工作在服务器的某个端口上,一旦启动服务,它将在这个端口上监听,等待客户程序发来请求,当有客户连接到该端口,accept()方法就返回一个Socket对象,可以用该对象获得一个输入输出流。服务器的套接字用服务器套接字类(ServerSocket)来建

6、立。具体实现如下:(1)建立一个服务者,端口为5000。(2)服务者永远等待,一旦客户送来正确的请求,连接至该端口,accept()方法就返回一个Socket对象。(3)用返回的Socket对象创建数据输入流类的实例in。用返回的Socket对象创建数据输出流的实例out。以上实例in和out是服务者用于从客户接受输入信息和向客户程序发送信息所用。此外,还需要用方法readline()和println()读取或输出一行数据。(4)soc.close()关闭Socket。 图1.2 基于UDP的SOCKET编程模型 1.2.2 通信的建立 在客户端建立Socket对象,并进行异常处理,主机名和端

7、口号与连接的服务器名和提供该服务的服务程序的监听端口必须一致。建立连接后用Socket类提供的getInputStream()和getOutputStream()方法取得输入输出流。在服务器端,获得的输入流是客户端的输出流,而Socket获得的输出流是发向客户端的输入流,在客户端也是这样。获得socket的输入输出流之后,为了便于读写操作,需要在这两个流对象基础上建立易于操作的数据流DateInputStream, DataOutputStream。然后对输入输出流进行读写操作。在通信结束时关闭socket,以断开连接,释放资源。先关闭对应的输入输出流,再关闭socket本身。2 程序设计2.

8、1系统结构本系统采用一个服务器端和多个客户端的聊天方式来实现。结构图如下所示:图2.1服务器-客户端结构图2.2主程序设计2.2.1 服务器端程序 服务器与客户间通过套接口Socket连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类.Socket.,使得编写网络应用程序相对容易服务器采用多线程以满足多用户的请求,程序用vector向量数组存储连接客户变量,通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为6666,然后无限循环调用accept()方法接受客户程序的连接。2.2.2 客户端程序 客户端是一个Java Applet程序,

9、客户通过Socket 建立与服务器的连接。图2.2主程序流程图 2.3 各模块设计2.3.1客户端向服务器发送消息 服务器与客户都通过构造DataInputStream, PrintStream来建立输入输出流,然后双方通过该输入输出流来相互传递信息,一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端然后向服务器发送消息, 2.3.2客户端之间发送消息 客户间发送信息通过UDP协议来实现,用户登录时通过类DatagramPacket和DatagramSocket创建UDP包括其本地接受端口以及发送端口,默认端口为new DatagramSocket()和

10、nickNameField.getText(),通过向服务器发送消息,然后服务器广播消息,最好达到群聊的目的。客户端发送消息(send(DatagramPacket)和接受消息(receive(DatagramPacket)。 2.4 界面设计2.4.1 聊天界面设计的方法在Frame布局容器中,添加一个显示聊天的TextArea文本框(在上面),加入Panel面板,Panel面板中包括一个发送消息的TextField单行文本框,“聊天记录”和“发送”两个按钮监听。 图2.3聊天界面实现功能图2.4.2 界面的功能 客户端登陆界面 输入服务器IP,接收端口,及用户名。登陆服务器,与服务器建立连

11、接,进入聊天界面。客户端聊天界面,进行聊天。并可查看聊天记录。服务器界面,监听客户端连接状况并可发送服务器消息。2.5 实现主要代码客户端代码:package udp;import java.io.*;import java.awt.*;import java.awt.event.*;import .*;class Client implements ActionListener, Runnable private Frame frame,f1,f2;/聊天窗口和登陆窗口private Panel p1, p2,p3;private Button sendButton,b,c,d;privat

12、e TextField serverIpField,sendField,receivePortField, nickNameField;private TextArea currentUserField;boolean isClient = false;private TextArea messageArea; /聊天记录框private String serverIp;private int serverReceivePort = 6666; /服务器接收默认端口private DatagramSocket receiveSocket = null, sendSocket = null;pr

13、ivate DatagramPacket receivePacket = null, sendPacket = null; /客户端登陆界面public void inputIP()/聊天记录界面public void input()/客户端聊天界面public void launchFrame() /启动客户端,完成登录public void start() try sendSocket = new DatagramSocket();/ 客户机发送端口sendMessage(nickNameField.getText() + :+ receivePortField.getText() + :

14、);/名字和接收端口new Thread(this).start(); catch (Exception e) messageArea.append(e + n);/客户端发送消息public void sendMessage(String str) try ByteArrayOutputStream out = new ByteArrayOutputStream();/捕获内存缓冲区的数据,转换成字节数组PrintStream pout = new PrintStream(out);/输出字节pout.print(str);byte buf = out.toByteArray();sendP

15、acket = new DatagramPacket(buf, buf.length, InetAddress.getByName(serverIp), serverReceivePort);/构造数据报包sendSocket.send(sendPacket);/发送数据报包buf = null; catch (Exception e) e.printStackTrace();messageArea.append(消息: + str + 发送失败,你还没有登录,或已经掉线!n);/多线程,启动接收信息public void run() receiveMessage();/ 客户机接收消息pub

16、lic void receiveMessage()try receiveSocket = new DatagramSocket(Integer.parseInt(receivePortField.getText();/ 客户机接受端口while (true) byte buf = new byte200;receivePacket = new DatagramPacket(buf, buf.length);receiveSocket.receive(receivePacket);if (receivePacket.getLength() = 0) messageArea.append(空消息

17、+ n);continue;ByteArrayInputStream bin = new ByteArrayInputStream(receivePacket.getData();/字节串变成输入流BufferedReader read = new BufferedReader(new InputStreamReader(bin);/先把字节流转换为字符流,然后放入缓冲区String str= read.readLine();messageArea.append(str);if(str.contains(迎:/)messageArea.append(n);read.close();bin.cl

18、ose(); catch (Exception e) messageArea.append(e + sendmessage errorn); /事件响应处理public void actionPerformed(ActionEvent e) /程序主入口 public static void main(String args) Client client = new Client(); / client.input(); client.inputIP(); 服务端端代码:package udp;import java.io.*;import java.awt.*;import java.awt

19、.event.*;import .*;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Iterator;public class Server implements ActionListener private Frame frame; / 主窗体private Label connectLabel, messageLabel;private TextArea messageArea; / 消息框,显示用户登录信息private TextField sendField

20、; / 输入聊天内容的文本框private Button sendButton; / 发送按钮private DatagramSocket receiveSocket = null, sendSocket = null;private DatagramPacket receivePacket = null, sendPacket = null;private int serverReceivePort = 6666; / 服务器端的接收端口private List clientList = new ArrayList(); / 保存连接的客户端信息boolean isServer = true

21、;/ 程序主入口public static void main(String args) Server server = new Server();server.launchFrame();server.start(); / 启动服务器server.receiveMessage(); / 接收信息/ 服务端界面初始化public void launchFrame() / 事件监听处理public void actionPerformed(ActionEvent e) / 启动服务器public void start() try sendSocket = new DatagramSocket(6

22、660);/ 服务器发送端口 catch (Exception e) messageArea.append(e + n);/ 服务器接收消息public void receiveMessage()try receiveSocket = new DatagramSocket(serverReceivePort);/ 服务器接受端口while (true) byte buf = new byte200;receivePacket = new DatagramPacket(buf, buf.length);receiveSocket.receive(receivePacket);int length

23、 = clientList.size();boolean have = false;ByteArrayInputStream bin = new ByteArrayInputStream(receivePacket.getData();BufferedReader read = new BufferedReader(new InputStreamReader(bin);String str = read.readLine();for (int i = 0; i length; i+) ClientMessage oldMsg = clientList.get(i);if (oldMsg.has

24、Client(receivePacket.getPort(),receivePacket.getAddress() have = true;break;/ 未存在此客户端if (!have) ClientMessage newMsg = new ClientMessage(Integer.parseInt(str.split(:)1.trim(),receivePacket.getPort(),receivePacket.getAddress();messageArea.append(用户: + str.split(:)0+ 进入聊天室,其IP地址:+ receivePacket.getAdd

25、ress().getHostAddress()+ 发送端口: + newMsg.getSendPort() + 接收端口:+ newMsg.getReceivePort() + 登录时间:+ new Date() + n);clientList.add(newMsg);sendMessage(热烈欢迎: + str.split(:)0 + IP:+ receivePacket.getAddress().getHostAddress()+ 加入聊天室!n); else / 用户已经存在sendMessage(str);read.close();bin.close(); catch (Except

26、ion e) / /e.printStackTrace();messageArea.append(e + sendmessage errorn);/ 服务器端发送消息给客户端public void sendToClient() /服务器 广播消息public void sendMessage(String str) ByteArrayOutputStream out = new ByteArrayOutputStream();PrintStream pout = new PrintStream(out);pout.print(str);byte buf = out.toByteArray();

27、 / 缓冲区int length = clientList.size();try / 转发给每一个在线用户for (int i = 0; i length; i+) ClientMessage msg = clientList.get(i);sendPacket = new DatagramPacket(buf, buf.length,msg.getClientIp(), msg.getReceivePort();sendSocket.send(sendPacket); catch (IOException e) e.printStackTrace();buf = null;class Cli

28、entMessage private int receivePort; / 客户端的接收端口private int sendPort; / 客户端的发送端口private InetAddress clientIp; / 客户端的IPpublic ClientMessage(int receivePort, int sendPort, InetAddress clientIp) this.receivePort = receivePort;this.clientIp = clientIp;this.sendPort = sendPort;public int getReceivePort() r

29、eturn receivePort;public InetAddress getClientIp() return clientIp;public int getSendPort() return sendPort;public boolean hasClient(int sendPort, InetAddress ip) if (ip.getHostAddress().equals(this.getClientIp().getHostAddress()& sendPort = this.getSendPort() return true;return false;2.6 程序调试及运行结果2

30、.6.1 调试前的准备安装jdk1.6.0并在计算机的环境变量中配置好java环境。使用的实验环境是Windows 7,Eclipse SDK 版本:3.2.0,。2.6.2 程序调试过程启动eclipse,单机测试。首先在主机上运行服务器端程序,再在器上运行3个客户端程序。然后进入到用户的图形用户界面,输入服务器的IP,进行连接,如果连接成功,则客户端就可以通过与服务器端进行通信,然后服务器转发通信,实现了多个客户之间的聊天功能。2.6.3 程序运行结果图2.4客户端登陆界面图2.5用户正常登陆后界面 图2.6登陆3个用户后服务器监听状况,客户端聊天状况3 课设体会通过实践让我们进一步掌握了

31、网络和Java的结合,实现了网络编程。充分了解了基于UDP编程和功能模块化的优越性,这样便于维护和修改,并且很容易找到它有可能出现的错误和漏洞。当编译没有错误的时候,进行执行时,往往开始几次都不能达到自己的理想效果,这个时候的修改工作往往更加复杂,尤其是这个程序,整个程序大体上由几个类来控制,但是其实里面的类与类相互之间的联系很多,类与类相互之间相互交织在一起,在设计的时候我就考虑了把实现一些功能类似的按钮的事件响应放到一起,这样在编译出错时就能很容易的修改错误,看起来也清晰明了,所以功能模块化对程序的阅读、调试、修改起了很重要的作用。但是这个程序从整体上的设计就导致了程序本身很难把各个功能模

32、块化,这也是程序的一个BUG,如果改进的化要从开始设计的时候几个大类要重新规划。在设计程序的时候还要考虑到用户的非法操作而可能引起的系统错误和数据丢失,该程序在这方面做的不好,编程过程中没有充分考虑了各种可能出错的情况,纠错功能并不完善。改进的时候要把纠错功能充分的考虑进去。其实编写程序不仅仅让我学到和更进一步的理解了语言算法的结构和思想,还进一步培养了我们缜密的思维,考虑问题更加周到。总之,要想学好更好,我们仍需培养更好的默契和付出更多的努力。参考文献1.James F.Kurose, Keith W.Ross, 陈鸣译, 计算机网络自顶向下方法(第四版), 机械工业出版社, 2009.1

33、2.Larry L. Peterson;Bruce S. Davie, 薛静锋等译, 计算机网络系统方法(第四版), 机械工业出版社, 2009.2 3.William Stallings, Computer Networking with Internet Protocols and Technology, Prentis Hall,20034.计算机网络互联网协议与技术(英文版), 电子工业出版社, 2006.8 5.Shivendra S.Panwar, etc, 陈涓译, TCPIP基础教程,人民邮电出版社, 2006.12 6.吴功宜. 计算机网络. 21世纪大学本科计算机专业系列教材. 清华大学出版社. 2003.8 7 Paul Hyde , java线程编程,人民邮电出版社.2006.8专心-专注-专业

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!