




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机网络课程设计说明书题 目: 基于UDP协议网上聊天程序 学 院: 计算机科学与工程学院 专 业: 信息安全 姓 名: 学 号: 指导教师: 孙晋永 目录1 协议介绍和使用说明31.1 协议内容31.2 关键技术41.2.1 服务器端Socket的实现41.2.2 通信的建立52 程序设计62.1系统结构62.2主程序设计72.2.1 服务器端程序72.2.2 客户端程序72.3 各模块设计82.3.1客户端向服务器发送消息82.3.2客户端之间发送消息82.4 界面设计82.4.1 聊天界面设计的方法82.4.2 界面的功能92.5 实现主要代码92.6 程序调试及运行结果152.6.1
2、 调试前的准备152.6.2 程序调试过程162.6.3 程序运行结果163 课设体会17参考文献181 协议介绍和使用说明1.1 协议内容本课程设计主要是基于UDP的并用Java实现的简单的聊天程序。UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的。UDP 在传送数据之前不需要先建立连接。对方的运输层在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 是一种最有效的工作方式。虽然UDP 用户数据报只能提供不可靠的交付,但 UDP 在某些方面有其特殊的优点,它有即时通信的功能。比如说,使用聊天程序聊天的时候,省去的了跟对方通信的时候的链接
3、的麻烦,直接进行通信。UDP 只在 IP 的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。UDP 是面向报文的。UDP 没有拥塞控制,很适合多媒体通信的要求。UDP 支持一对一、一对多、多对一和多对多的交互通信。发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。接收方 UDP 对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动
4、地交付上层的应用进程,一次交付一个完整的报文。 图1.1UDP基本工作过程1.2 关键技术1.2.1 服务器端Socket的实现Socket又称作套接字,它是使用标准Unix文件描述符(filedescriptor)和其它程序通讯的方式。使用send()和recv()让你更好的控制数据传输。在Java 网络编程中,socket相当于应用程序的港口码头;在计算机网络中,套接字由ip地址和端口号组成,为进程之间通信提供地址。两个主机进行通信实际上就是两个主机中的应用进程互相通信,应用进程之间的通信又称为端到端的通信。为应用进程之间的通信提供运输服务的是运输层的运输协议,运输层需要有两种不同的运输协
5、议,即面向连接的TCP和无连接的UDP。 在Java中,用于实现基于UDP的聊天程序,使用两个重要的类(DatagramSocket类和DatagramPacket类)。DatagramSocket类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。 在DatagramSocket上总是启用UDP广播发送。为了接收广播包,应该将 DatagramSocket绑定到通配符地址。在某些实现中,将DatagramSocket绑定到一个更加具体
6、的地址时广播包也可以被接收。atagramPacket类表示数据报包。 数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。服务程序工作在服务器的某个端口上,一旦启动服务,它将在这个端口上监听,等待客户程序发来请求,当有客户连接到该端口,accept()方法就返回一个Socket对象,可以用该对象获得一个输入输出流。服务器的套接字用服务器套接字类(ServerSocket)来建立。具体实现如下:(1)建立一个服务者,端口为5000。(2)服务者永远等待,一旦
7、客户送来正确的请求,连接至该端口,accept()方法就返回一个Socket对象。(3)用返回的Socket对象创建数据输入流类的实例in。用返回的Socket对象创建数据输出流的实例out。以上实例in和out是服务者用于从客户接受输入信息和向客户程序发送信息所用。此外,还需要用方法readline()和println()读取或输出一行数据。(4)soc.close()关闭Socket。 图1.2 基于UDP的SOCKET编程模型 1.2.2 通信的建立 在客户端建立Socket对象,并进行异常处理,主机名和端口号与连接的服务器名和提供该服务的服务程序的监听端口必须一致。建立连接后用Sock
8、et类提供的getInputStream()和getOutputStream()方法取得输入输出流。在服务器端,获得的输入流是客户端的输出流,而Socket获得的输出流是发向客户端的输入流,在客户端也是这样。获得socket的输入输出流之后,为了便于读写操作,需要在这两个流对象基础上建立易于操作的数据流DateInputStream, DataOutputStream。然后对输入输出流进行读写操作。在通信结束时关闭socket,以断开连接,释放资源。先关闭对应的输入输出流,再关闭socket本身。2 程序设计2.1系统结构本系统采用一个服务器端和多个客户端的聊天方式来实现。结构图如下所示:图2
9、.1服务器-客户端结构图2.2主程序设计2.2.1 服务器端程序 服务器与客户间通过套接口Socket连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类.Socket.,使得编写网络应用程序相对容易服务器采用多线程以满足多用户的请求,程序用vector向量数组存储连接客户变量,通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为6666,然后无限循环调用accept()方法接受客户程序的连接。2.2.2 客户端程序 客户端是一个Java Applet程序,客户通过Socket 建立与服务器的连接。图2.2主程序流程图 2
10、.3 各模块设计2.3.1客户端向服务器发送消息 服务器与客户都通过构造DataInputStream, PrintStream来建立输入输出流,然后双方通过该输入输出流来相互传递信息,一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端然后向服务器发送消息, 2.3.2客户端之间发送消息 客户间发送信息通过UDP协议来实现,用户登录时通过类DatagramPacket和DatagramSocket创建UDP包括其本地接受端口以及发送端口,默认端口为new DatagramSocket()和nickNameField.getText(),通过向服务器发送消
11、息,然后服务器广播消息,最好达到群聊的目的。客户端发送消息(send(DatagramPacket)和接受消息(receive(DatagramPacket)。 2.4 界面设计2.4.1 聊天界面设计的方法在Frame布局容器中,添加一个显示聊天的TextArea文本框(在上面),加入Panel面板,Panel面板中包括一个发送消息的TextField单行文本框,“聊天记录”和“发送”两个按钮监听。 图2.3聊天界面实现功能图2.4.2 界面的功能 客户端登陆界面 输入服务器IP,接收端口,及用户名。登陆服务器,与服务器建立连接,进入聊天界面。客户端聊天界面,进行聊天。并可查看聊天记录。服务
12、器界面,监听客户端连接状况并可发送服务器消息。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;private TextField serverIpField
13、,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;private DatagramPacket rece
14、ivePacket = null, sendPacket = null; /客户端登陆界面public void inputIP()/聊天记录界面public void input()/客户端聊天界面public void launchFrame() /启动客户端,完成登录public void start() try sendSocket = new DatagramSocket();/ 客户机发送端口sendMessage(nickNameField.getText() + :+ receivePortField.getText() + :);/名字和接收端口new Thread(this
15、).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();sendPacket = new DatagramPacke
16、t(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();/ 客户机接收消息public void receiveMessage()
17、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(空消息 + n);continue;ByteArrayIn
18、putStream 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.close(); catch (Exception e
19、) 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.event.*;import .
20、*;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; / 输入聊天内容的文本框pri
21、vate 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;/ 程序主入口public st
22、atic 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(6660);/ 服务器发送端口 ca
23、tch (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 = clientList.siz
24、e();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.hasClient(receivePac
25、ket.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.getAddress().getHostAdd
26、ress()+ 发送端口: + 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 (Exception e) / /e.print
27、StackTrace();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(); / 缓冲区int length
28、= 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 ClientMessage privat
29、e 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() return receivePort
30、;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.6.1 调试前的准备安装jdk1.6.0并在计算机的环境变量中配置好java环境。使用的实验环境是Windows 7,Eclipse SDK 版本:3.2.0,。2.6.2 程序调试过程启动eclipse,单机测试。首先在主机上运行服务器端程序,再在器上运行3个客户端程序。然后进入到用户的图形用户界面,输入服务器的IP,进行连接,如果连接成功,则客户端就可以通过与服务器端进行通信,然后服务器转发通信,实现了多个客户之间的聊天功能。2.6.3 程序运行结果图2.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 如何提高财务数据的使用效率计划
- 医院行政人员工作计划
- 2025-2030中国防火防烟执行器行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国防水蓝牙扬声器行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国防弹玻璃行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国镇流器市场行情监测及发展趋势前景分析研究报告
- 2025-2030中国锚固连接器行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国银喷涂设备行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国铝型材行业深度调研及投资前景预测研究报告
- 2025-2030中国钐过滤器行业市场发展趋势与前景展望战略研究报告
- 小学语文整本阅读指导课《城南旧事》教学案例
- (机械创新设计论文)
- GB/T 39802-2021城镇供热保温材料技术条件
- GB/T 2792-2014胶粘带剥离强度的试验方法
- GB/T 21566-2008危险品爆炸品摩擦感度试验方法
- GB/T 215-2003煤中各种形态硫的测定方法
- GB/T 17492-2012工业用金属丝编织网技术要求和检验
- GB/T 17207-2012电子设备用固定电容器第18-1部分:空白详细规范表面安装固体(MnO2)电解质铝固定电容器评定水平EZ
- GB/T 16886.7-2001医疗器械生物学评价第7部分:环氧乙烷灭菌残留量
- 国开电大《人员招聘与培训实务》形考任务4国家开放大学试题答案
- 铁路职工政治理论应知应会题库
评论
0/150
提交评论