闲来无事,写个基于UDP协议的Socket通讯Demo

http://www.cnblogs.com/dipwater/p/3578252.html

项目一期已经做完,二期需求还没定稿,所以最近比较闲。

  上一篇写的是TCP协议,今天写一下UDP协议。TCP是有连接协议,所以发送和接收消息前客户端和服务端需要建立连接;UDP是无连接协议,所以发送消息前不需要建立连接,只需向指定的网络端点发送消息即可,不管端点是否存在都可以发送,无论消息是否到达端点都不关心,接收消息前也不需要建立连接,只需要在本地绑定的端口上接收就可以了,UDP没有明确的客户端和服务端。

  程序是基于命令行的,启动一个实例之后根据界面提示输入本地端口号、远程IP、远程端口号即可,可以启动多个实例互相通讯。

  程序启动之后首先根据输入的本地端口号绑定本地端口,其次启动一个线程接收本地端口的数据,然后界面上提示输入消息,输入完成则发送到远程IP和远程端口号,界面上再次提示输入消息……

  运行效果图:

图1. 实例1

 

图2. 实例2

扫描二维码关注公众号,回复: 5567712 查看本文章

关键代码

  绑定本地端口:

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);

复制代码

  本人才疏学浅,欢迎大家批评指正!

猜你喜欢

转载自blog.csdn.net/kingshown_WZ/article/details/52103684
今日推荐