http://www.cnblogs.com/dipwater/p/3578252.html
项目一期已经做完,二期需求还没定稿,所以最近比较闲。
上一篇写的是TCP协议,今天写一下UDP协议。TCP是有连接协议,所以发送和接收消息前客户端和服务端需要建立连接;UDP是无连接协议,所以发送消息前不需要建立连接,只需向指定的网络端点发送消息即可,不管端点是否存在都可以发送,无论消息是否到达端点都不关心,接收消息前也不需要建立连接,只需要在本地绑定的端口上接收就可以了,UDP没有明确的客户端和服务端。
程序是基于命令行的,启动一个实例之后根据界面提示输入本地端口号、远程IP、远程端口号即可,可以启动多个实例互相通讯。
程序启动之后首先根据输入的本地端口号绑定本地端口,其次启动一个线程接收本地端口的数据,然后界面上提示输入消息,输入完成则发送到远程IP和远程端口号,界面上再次提示输入消息……
运行效果图:
图1. 实例1
图2. 实例2
关键代码
绑定本地端口:
1 var localPoint = new IPEndPoint(0, localPort);
2 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
3 socket.Bind(localPoint);
启动线程执行数据接收:
1 // 启动新线程负责接收数据
2 ThreadPool.QueueUserWorkItem(OnReceive, socket);
3 Show("准备就绪");
数据接收细节:
1 /// <summary>
2 /// 接收数据
3 /// </summary>
4 /// <param name="obj"></param>
5 private static void OnReceive(object obj)
6 {
7 try
8 {
9 var socket = obj as Socket;
10 if (socket == null)
11 {
12 return;
13 }
14
15 while (true)
16 {
17 try
18 {
19 var receiveBuffer = new byte[1024];
20 // 接收数据
21 EndPoint remotePoint = new IPEndPoint(IPAddress.Any, 0);
22 var receiveLength = socket.ReceiveFrom(receiveBuffer, ref remotePoint);
23 ...
24 }
25 catch (ThreadAbortException)
26 {
27 throw;
28 }
29 catch (SocketException exception)
30 {
31 ...
32 }
33 catch (Exception exception)
34 {
35 ...
36 }
37 }
38 }
39 catch (ThreadAbortException)
40 {
41 ...
42 }
43 catch (Exception exception)
44 {
45 ...
46 }
47 }
循环执行数据发送:
1 do
2 {
3 try
4 {
5 Show("请输入消息:", false);
6 var msg = Read();
7 ...
8 // 发送数据
9 EndPoint sendPoint = new IPEndPoint(address, remotePort);
10 var sendLength = socket.SendTo(sendBuffer, sendPoint);
11 ...
12 }
13 catch (SocketException exception)
14 {
15 ...
16 }
17 catch (Exception exception)
18 {
19 ...
20 }
21 } while (true);
本人才疏学浅,欢迎大家批评指正!