实验报告实验名称:基于UDP的聊天系统课程名称:计算机网络编程班级:计122姓名:学号:教师:张晓明信息工程学院计算机系目录1、需求分析.........................................................................................11.1课程设计目的................................................................................11.2课程设计内容................................................................................11.3课程设计要求................................................................................12、概要设计.......................................................................................12.1原理概述........................................................................................12.2功能模块调用流程设计.................................................................23详细设计...........................................................................................33.1流程图.........................................................................................33.2运行效果图....................................................................................43.3功能实现........................................................................................53.3.1DES算法加密解密......................................................................53.3.2窗口震动.....................................................................................83.3.3保存聊天记录.............................................................................94项目分析与总结..............................................................................104.1遇到的问题和解决方法...............................................................104.2心得体会.......................................................................................10第1页共10页1、需求分析1.1课程设计目的开发一个专用于实现两台计算机之间即时通讯的软件,以方便两台计算机之间信息的交流。在连接并通信时,尤其是近程的即时通讯,彻底的脱离了远程的服务器,避免了和远程服务器连接时过多的浪费网络资源。并且避免了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接!因此,这个软件是极具适应性和实用性的即时通讯软件!本次课程设计的目的是学习基于UDP协议实现网络聊天程序,已达到学会面向无连接方式的程序设计方法,并理解网络编程中面向无连接的概念。1.2课程设计的内容用户数据报(UDP)是一个无连接协议,使用这种协议时,并不需要在两台计算机之间建立固定的连接,也就是说,通信双方没有服务器和客户机之分,它们之间进行的是对等通信,所以它的优势很明显,是现代通信不可或缺的一部分。所以,利用它的优势设计一个可以实现私聊和群聊的软件,实现两台计算机间的即时通讯。1.3课程设计要求基于UDP协议实现一对一的聊天和一对多的聊天,提供友好的用户界面,便于用户进行操作。根据目前使用聊天程序的用户需求显示,用户对于聊天程序主要有以下几点要求:(1)聊天功能:可以实现实时接收和发送文字信息,并能支持公聊和私聊的方式。(2)用户功能:可以查看对方的开放信息,以及发送方的IP。2概要设计2.1原理概述用户数据报协议(UserDatagramProtocol)是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。是一个简单的面向数据报的传输层协议,IETFRFC768是UDP的正式规范。UDP协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。由于UDP比较简单,UDP头包含很少的字节,比TCP负载消耗少。UDP适用于不需要TCP可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。UDP是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)、动态主机配置协议(DHCP)、路由信息协议(RIP)和某些影音串流服务等等。采用UDP协议,通过服务器中转方式。因此,现在的IP侦探在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。UDP协议是不可靠协议,它只管发送,不管对方是否收到。但它的传输很高效,因为UDP协议排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。例如,腾讯采用了上层协议来第2页共10页保证可靠传输:如果客户端使用UDP协议发出消息后,服务器收到该包,需要使用UDP协议发回一个应答包。如此来保证消息可以无遗漏传输。2.2功能模块调用流程设计:3详细设计3.1流程图第3页共10页否是是否否是否是是初始化各个控件群聊窗口保存按钮进行群聊接收框接受信息点击IP用户进行私聊退出程序保存聊天信息输入发送信息是否群聊接收框显示接受信息发送按钮退出按钮结束开始震动按钮私聊用户窗口震动第4页共10页3.2界面设计与运行效果图//界面设计//群聊界面//私聊界面第5页共10页3.3功能实现3.3.1DES算法加密、解密DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。//加密解密流程图加密代码:privatestaticbyte[]Keys={0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF};///summary///DES加密字符串////summary第6页共10页///paramname=encryptString待加密的字符串/param///paramname=encryptKey/param///returns/returnspublicstringEncryptDES(stringencryptString){try{byte[]rgbKey=Encoding.UTF8.GetBytes(textBox2.Text);byte[]rgbIV=Keys;byte[]inputByteArray=Encoding.UTF8.GetBytes(encryptString);DESCryptoServiceProviderdCSP=newDESCryptoServiceProvider();MemoryStreammStream=newMemoryStream();CryptoStreamcStream=newCryptoStream(mStream,dCSP.CreateEncryptor(rgbKey,rgbIV),CryptoStreamMode.Write);cStream.Write(inputByteArray,0,inputByteArray.Length);cStream.FlushFinalBlock();returnConvert.ToBase64String(mStream.ToArray());}catch{returnencryptString;}}加密前:(加密das字符串)加密后:解密代码:///summary///DES解密字符串第7页共10页////summary///paramname=decryptString/param///paramname=decryptKey/param///returns/returnspublicstringDecryptDES(stringdecryptString){try{byte[]rgbKey=Encoding.UTF8.GetBytes(textBox2.Text);byte[]rgbIV=Keys;byte[]inputByteArray=Convert.FromBase64String(decryptString);DESCryptoServiceProviderDCSP=newDESCryptoServiceProvider();MemoryStreammStream=newMemoryStream();CryptoStreamcStream=newCryptoStream(mStream,DCSP.CreateDecryptor(rgbKey,rgbIV),CryptoStreamMode.Write);cStream.Write(inputByteArray,0,inputByteArray.Length);cStream.FlushFinalBlock();returnEncoding.UTF8.GetString(mStream.ToArray());}catch{returndecryptString;}}解密前:解密后:(解密后为das)第8页共10页3.3.2窗口震动//流程图//点击震动按钮privatevoidbutton3_Click(objectsender,EventArgse){IPAddressmyIP;//获得本机局域网IP地址myIP=newSystem.Net.IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address);IPAddressip=IPAddress.Parse(txt_ip.Text.Trim());IPEndPointipto=newIPEndPoint(ip,6000);byte[]byMsg=System.Text.Encoding.UTF8.GetBytes(EncryptDES(1));SocketsockSend=newSocket(Addre