基于UDP协议的网络聊天程序设计.docx
《基于UDP协议的网络聊天程序设计.docx》由会员分享,可在线阅读,更多相关《基于UDP协议的网络聊天程序设计.docx(15页珍藏版)》请在冰点文库上搜索。
基于UDP协议的网络聊天程序设计
实验报告
实验名称:
基于UDP的聊天系统
课程名称:
计算机网络编程
班级:
计122
姓名:
学号:
*******
信息工程学院计算机系
1、需求分析.........................................................................................1
1.1课程设计目的................................................................................1
1.2课程设计内容................................................................................1
1.3课程设计要求................................................................................1
2、概要设计.......................................................................................1
2.1原理概述........................................................................................1
2.2功能模块调用流程设计.................................................................2
3详细设计...........................................................................................3
3.1流程图.........................................................................................3
3.2运行效果图....................................................................................4
3.3功能实现........................................................................................5
3.3.1DES算法加密解密......................................................................5
3.3.2窗口震动.....................................................................................8
3.3.3保存聊天记录.............................................................................9
4项目分析与总结..............................................................................10
4.1遇到的问题和解决方法...............................................................10
4.2心得体会.......................................................................................10
1、需求分析
1.1课程设计目的
开发一个专用于实现两台计算机之间即时通讯的软件,以方便两台计算机之间信息的交流。
在连接并通信时,尤其是近程的即时通讯,彻底的脱离了远程的服务器,避免了和远程服务器连接时过多的浪费网络资源。
并且避免了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接!
因此,这个软件是极具适应性和实用性的即时通讯软件!
本次课程设计的目的是学习基于UDP协议实现网络聊天程序,已达到学会面向无连接方式的程序设计方法,并理解网络编程中面向无连接的概念。
1.2课程设计的内容
用户数据报(UDP)是一个无连接协议,使用这种协议时,并不需要在两台计算机之间建立固定的连接,也就是说,通信双方没有服务器和客户机之分,它们之间进行的是对等通信,所以它的优势很明显,是现代通信不可或缺的一部分。
所以,利用它的优势设计一个可以实现私聊和群聊的软件,实现两台计算机间的即时通讯。
1.3 课程设计要求
基于UDP协议实现一对一的聊天和一对多的聊天,提供友好的用户界面,便于用户进行操作。
根据目前使用聊天程序的用户需求显示,用户对于聊天程序主要有以下几点要求:
(1)聊天功能:
可以实现实时接收和发送文字信息,并能支持公聊和私聊的方式。
(2)用户功能:
可以查看对方的开放信息,以及发送方的IP。
2 概要设计
2.1 原理概述
用户数据报协议(User Datagram Protocol)是 OSI 参考模型中一种无连
接的传输层协议,提供面向事务的简单不可靠信息传送服务。
是一个简单的面向数据报的传输层协议,IETF RFC 768是UDP的正式规范。
UDP 协议基本上是 IP 协议与上层协议的接口。
UDP 协议适用端口分别运行在同一台设备上的多个应用程序。
与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。
由于 UDP 比较简单, UDP 头包含很少的字节,比TCP负载消耗少。
UDP适用于不需要TCP可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。
UDP是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)、动态主机配置协议(DHCP)、路由信息协议(RIP)和某些影音串流服务等等。
采用UDP协议,通过服务器中转方式。
因此,现在的IP侦探在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。
UDP 协议是不可靠协议,它只管发送,不管对方是否收到。
但它的传输很高效,因为UDP协议排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。
例如,腾讯采用了上层协议来保证可靠传输:
如果客户端使用UDP协议发出消息后,服务器收到该包,需要使用UDP协议发回一个应答包。
如此来保证消息可以无遗漏传输。
2.2功能模块调用流程设计:
3 详细设计
3.1流程图
否
是
是
否
否
是
否
是
是
3.2界面设计与运行效果图
//界面设计
//群聊界面
//私聊界面
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};
///
///DES加密字符串
///
///待加密的字符串
///
///
publicstringEncryptDES(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字符串)
加密后:
解密代码:
///
///DES解密字符串
///
///
///
///
publicstringDecryptDES(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)
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(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
sockSend.SendTo(byMsg,ipto);
}
}
//接收方接收到字符串后窗口震动
voidRecvMsg()
{
while(true)
{
intlen=sockRecv.ReceiveFrom(byMsg,refsenderRemote);
if(DecryptDES(System.Text.Encoding.UTF8.GetString(byMsg,0,len))=="1")
{
for(intj=0;j<30;j++)
{
for(inti=1;i<5;i++)
{
Thread.Sleep(10);
this.Left-=1;
this.Top-=1;
}
for(inti=1;i<5;i++)
{
Thread.Sleep(10);
this.Left+=1;
this.Top+=1;
}
}
}
else
txt_recvmsg.AppendText(((IPEndPoint)senderRemote).Address.ToString()+":
"
+DecryptDES(System.Text.Encoding.UTF8.GetString(byMsg,0,len))+"\r\n");
}
}
3.3.3保存聊天记录
//保存源代码
privatevoidbutton2_Click(objectsender,EventArgse)
{
StreamWritersw=newStreamWriter("D:
\\私聊信息.txt");
sw.WriteLine(this.txt_recvmsg.Text);//开始写入值
sw.Close();
}
privatevoidbutton2_Click_1(objectsender,EventArgse)
{
StreamWritersw=newStreamWriter("D:
\\群聊信息.txt");
sw.WriteLine(this.MessageOutput.Text);//
sw.Close();
}
4项目分析与总结
4.1遇到的问题和解决方法:
在创建窗体时,由于对有些控件不了解,所以在应用时,查找了一些相关资料,学会
了如何添加和使用。
其中有段程序是选择现有文件夹里的ico图标,但是由于没有把图片放在指定的地方,所以在运行时,总是提示找不到指定的文件。
这个程序中有段功能是选择群聊中的任何一个IP可以进行私聊,之前由于没有实现去除重复IP的内容,在显示时,当一个IP连续发送两条信息时,下拉框中会显示两个相同的IP,为了实现唯一性,加了一个嵌套循环,当两个IP相同时,去掉后一个。
主要注意以下几点:
1. UDP多播地址的范围:
224.0.0.0---239.255.255.255
2. JoinMulticastGroup方法将套接字加入多播组。
JoinMulticastGroup(IPAddress multicastAddr, int timeToLive) multicastAddr为要连接的多播地址,timeToLive为生存时间TTL
3. DropMulticastGroup方法退出多播组。
DropMulticastGroup(IPAddress multicastAddr, int ifindex)
multicastAddr为要连接的多播地址,ifindex为要退出多播组的本地地址
4. UTF-8是UNICODE的一种变长字符编码又称万国码,UTF-8用1到6个字节编码UNICODE字符。
用在网页上可以同一页面显示中文简体繁体及其它语言(如日文,韩文)
4.2心得体会
这次实验是在边学习边实践的基础上完成的,通过学习“计算机网络编程”,我们对网络的基础知识打下了很好的基础。
这次网络实验可以说是在理解网络的基础上对编程的一次学习过程,虽然做的不是很完善,但也学到了很多知识。
例如,vs2008的使用和对c#语句的理解都有了很大的提高。
这对自己以后进行网络开发有很大的帮助。
PS:
要完整代码的Q842233628