在.net中使用Udp协议创建简单的聊天程序
在.net中使用Udp协议创建简单的聊天程序
电子科技大学软件学院03级 周银辉
转载请注明出处
1,说明:
在这之前你应该对网络协议有一点点了解(比如至少知道Socket,知道udp与tcp的区别),由于.net将相关知识包装得太好,所以你可以利用System.net.socket名字空间里的类轻松地编写一个聊天程序,但却不知道为什么应该这样,如果需要了解细节,你可以尝试使用VC++来完成这个程序。
需要了解更多的知识,你可以访问“中国协议网”http://www.cnpaf.net/。
2,怎样连接两台计算机?
注意,Udp是无连接传输协议,也就时说它在通信前不会实现在两台计算机之间建立连接。它只会守候在指定的端口上等待传入的数据以及将数据从指定的端口上“抛”出去,而不会去顾及数据的传输。这一点也就造成了数据传输的不可靠性。
在我们的程序中,通信的两台计算机之间是平等的关系,没有主机于客户端之分(你也可以指定默认主机,但那是另一个程序)
3,如何利用Udp协议?
通过UdpClient类, 它将为我们提供Udp网络服务,最简单的说法是我们可以用它来进行基于Udp协议的接收信息和发送信息。
注意,它是阻塞的(处于阻塞(或同步)模式时,套接字的函数直到可以完成自己的操作时才返回)。
4, 对方是谁?
要链接到对方,我们得知道对方是谁, 很容易想到的是通过ip地址,除此之外,要完成我们的通信,还要有一个数据:端口号。
IPEndPoint,组合了ip地址和端口号的数据结构。在我们的程序中将用它来形成通信的连接点。
5,如何接收信息?
服务员守住门口,有客来就把他拉进来
服务员:我们自己的一个UdpClient对象
门口: 本机端口
客人来自:远程计算机对应的IPEndPoint对象
拉进来:UdpClient对象的Receive()方法
注意:Receive()方法是阻塞的,也就是说它在得到远程传来的数据后才会返回,否则一直等待(服务员将一直守在门口,直到有客人来),这将造成其所在线程的阻塞,那么我们将在非主线程中执行该方法。
private void GetMessage()
{
this.clientGetMsg = new UdpClient(this.port);//this.port我们指定的端口号
//用于保存远程计算机ip和端口信息(保存客人从哪里来的信息)
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
byte[] btInfo;
while (true)
{
try
{
//接收信息
btInfo = this.clientGetMsg.Receive(ref remoteEP);
}
catch (Exception)
{
//MessageBox.Show("error at receiving msg:\n" + ex.Message);
return;
}
//将得到的数据进行处理,我们这里是将它转成字符串
string msg = Encoding.Default.GetString(btInfo);
//
//do something else
//
}
}
6,如何发送信息?
告诉邮递员收信人地址和姓名,让邮递员来传递。
邮递员:UdpClient对象
收信人地址:远程计算机Ip
收信人:远程计算机某一端口
传递:UdpClient对象的Send()方法
注意,请在非主线程中执行该方法
private void SendMessage()
{
string ip = "10.0.0.122" //假设这是对方的Ip;
UdpClient client = new UdpClient(ip,this.port);//this.port我们指定的端口
//我们要传送的数据,这里传送了一个字符串
Byte[] btInfo = Encoding.Default.GetBytes("Information");
try
{
client.Send(btInfo, btInfo.Length);
}
catch (Exception ex)
{
//MessageBox.Show("error at sending msg:\n" + ex.Message);
return;
}
client.Close();
//
//do something else
//
}
7,更多的
这里仅仅简单地介绍了相关内容,可以在msdn库找到更多有趣的内容。
程序较简单就没有必要提供源代码下载了。
如果你的确需要的话,可以通过这个email:yinhui_zhou@yahoo.com.cn索取