资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
计算机网络课程设计报告基于UDP的即时通信工具的设计开发江苏大学计算机学院2015年 7月2日目录1 设计要求与开发环境41.1目标与内容41.2 要求51.3 实现要求52 UDP协议52.1 UDP协议简介52.2 UDP的使用62.3 UDP的特性73 程序设计83.1 点对点通信83.1.1设计思路83.1.2具体实现83.2群组即时通信93.2.1设计思路93.2.2服务器111用户类和在线用户112流程图123具体实现134界面设计135实现的功能143.2.3客户端141本地用户类142具体实现143界面设计154项目测试155 过程与总结171 设计要求与开发环境1.1目标与内容(1)任务一,设计一个基于UDP的点对点通信工具,实现点对点的通信,如下图所示,用户发送的信息将在对方用户中显示,显示内容包括“源IP+发送时间+发送内容”。(2)任务二,设计实现一个基于UDP的群组即时通信工具,如下图所示,每个用户发送的信息将在其他用户中显示,显示内容包括“用户名+发送时间+发送内容”。其中功能主要包括:用户注册、用户登录、用户删除、信息发送与接收、信息保存、历史信息查询等1.2 要求(1)熟悉C#.NET开发环境(2)熟悉Socket等相关通信组件(3)通信协议的定义、封装与解析(4)也可以采用自己熟悉的开发语言或工具实现1.3 实现要求1基于UDP的点对点通信工具,实现点对点的通信,用户发送的信息将在对方用户中显示,显示内容包括“源IP+发送时间+发送内容”。 2实现一个基于UDP的群组即时通信工具,每个用户发送的信息将在其他用户中显示,显示内容包括“用户名+发送时间+发送内容”。3 对于2中还要实现功能主要包括:用户注册、用户登录、用户删除、信息发送与接收、信息保存、历史信息查询等。1.4开发环境软件环境:Microsoft Visual Studio2008 使用C#编写硬件环境:计算机学院305电脑,个人笔记本电脑2 UDP协议2.1 UDP协议简介 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。2.2 UDP的使用在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的QQ就是使用的UDP协议。虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。2.3 UDP的特性(1) UDP是一个无连接协议,传输数据之前发送端和接收端不建立连接,当UDP它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。(6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。(以上内容摘录自百度百科)3 程序设计3.1 点对点通信3.1.1设计思路 程序开始运行时启动一个接收线程,接收线程中将启用一个固定端口号如8000专门用于接收数据并且处于后台运行状态,也就是说程序启动到结束程序的这一过程中程序一直在监听是否有信息发送到该程序,若接收到数据,则将数据处理后显示在消息窗口;当发送用户要发送消息时,发送用户先输入接收用户的用户信息,程序会接受用户输入的用于发送的内容,经处理后通过UDP协议将用户数据发送出去同时将其显示本地的消息窗口。3.1.2具体实现1 接收线程程序开始运行时接收函数启动开始接收线程并一直在后台运行监听消息,调用的listen()函数中有用于接收的无限循环。private void Receive()/接收函数 thread = new Thread(new ThreadStart(listen);/新建进程 thread.IsBackground = true;/设置为后台进程 thread.Start();/线程开始 2 发送函数按下发送按钮后,程序将自动获取用户输入的目的IP、端口号、要发送的内容最后发送。private void btSend_Click(object sender, EventArgs e)/发送string dstIP = this.IpAddress.Text.ToString();/获取目的IPstring dstPort= this.PortNo.Text.ToString();/获取目的端口string temp = this.SendMessage.Text;/获取要发送消息byte sendData =System.Text.Encoding.UTF8.GetBytes(temp);/将发送的字符串转换为byte/将IP地址字符串转化为IP 地址和端口号实例 udpSender.Connect(IPAddress.Parse(dstIP),Int32.Parse(dstPort);/发送用户开始连接接收用户 udpSender.Send(sendData, sendData.Length); /向接收用户发送消息string dataTime = System.DateTime.Now.ToString();/获取系统时间Message.Items.Add(本机:);/将发送的消息在本地输出Message.Items.Add(dataTime);Message.Items.Add(temp);SendMessage.Clear();/清空输入框3 界面设计3.2群组即时通信3.2.1设计思路群组即时通信是要实现当群组内的一个用户发送消息时其他在线的每个用户要能收到这一消息。参考点对点通信,我们可以这样想,在点对点通信中,发送用户只是对要接收的单个用户发送了消息,现在让群组通信中的客户端即发送用户来实现这一功能只是接收的用户不在是一个而是两个或多个。但这样做在实现发送时会变得十分复杂,较难解决该发给谁这个问题。因为这时对在线用户即接收用户的处理是分散在每个客户端独立地进行,客服端重复工作且较易出错,给客户端带来不必要的负担。因此引入了服务器,由服务器进行这个将消息转发给所有在线用户的过程。客户端只需将要发送的数据发送给服务器就可以了,剩下的工作全部交给服务器处理,服务器将会把每个客户端发送过来的有效数据转发给每个在线用户。当然,服务器同样面临着将消息发给谁的问题。解决好这个问题才有可能做到余下要求的功能。在点对点的通信中,通信的原理是发送方依据接收方的IP地址和端口号组成的IPEndPoint的内容类似于收信人地址来把消息正确送达接收方的。所以在服务器端关于发给谁的这个问题就是把每个要接收的客户端的用于接收的IPEndPoint保存起来组成一个在线用户列表,在发送的时候把它调用出来依据这个在线用户列表对要发送的消息给每个要接收的客户端转发一遍。这样就解决了发给谁这个核心问题。这样服务器将负责在线用户列表的更新和维护,提高效率和正确性的同时也节约了资源。此时,客户端对在线用户的获取只需将服务器处理过后的在线用户列表发送给客户端,客户端接收带有用户列表的数据处理后再将其输出到屏幕。余下的功能就可以依靠这个转发的功能来实现。首先,在服务器创建一个空的用户列表和一个空的在线用户列表。以后当有用户注册时就将其用户信息如用户名、用户密码、在线状态等写入一个空的用户并保存起来。有用户上线就将该用户发送过来的用来接收的IPEndPoint写入这个用户的用户信息中代替原有的无效的内容,同时把这个用户加入到在线用户列表。用户下线时只需修改用户的在线状态和在线用户列表即可。总的设计思路大概就是这样,在服务器建一个用于接收的用户列表,以这个列表的用户内容为依据来转发消息。编写过程中要注意的是服务器和客户端之间的沟通交流,数据在服务器和客户端间传送,双方都应能理解。所以先写服务器再根据服务器的设定来编写客户端。3.2.2服务器服务器的功能较多而且需要用到很多的判断语句。1用户类和在线用户用户类要包含用户的基本信息用户名和用户密码、用户用于接收的IPEndPoint,为了便于用户在用户列表和在线用户列表间的处理在用户类中还增添了一个整型数据用于表示用户在在线用户列表中的位置。在线用户列表是一个用于保存在线用户在用户列表中的数组下标的整型数组。用户列表的容量可以适当扩充,在线用户列表的容量则需根据服务器的处理能力来设置。public class user public string userName;/用户名 public string userKey;/用户密码 public IPEndPoint userRecIPEndPoint;/用户接收IPendPoint public bool status;/用户状态,true在线、false下线 public int position;/在用户列表中的位置 user userlist=new user1000;/创建1000个空用户int nowUserPosition = new int100;/记录在线用户位置在用户列表的位置即在线用户列表2流程图服务器一启动就一直处于接收数据状态,接收到数据后依据数据的
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号