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


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

      上一篇写的是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);

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

     

    源代码下载

     

  • 相关阅读:
    用于视频行为识别的双流卷积网络
    python更改默认版本
    ubuntu16安装ROS(包括win10子系统ubuntu同样能用)
    js中的new做了什么?
    Promise是什么?
    滚动轴 scroll
    什么是ES6?
    什么是token及怎样生成token
    mongodb 删库跑路
    css如何设置背景图片?background属性添加背景图片
  • 原文地址:https://www.cnblogs.com/dipwater/p/3578252.html
Copyright © 2020-2023  润新知