zoukankan      html  css  js  c++  java
  • C# UdpClient使用Receive和BeginReceive接收消息时的不同写法

    使用Receive(同步阻塞方式), 注意使用同步方法时,需要使用线程来开始方法,不然会使UI界面卡死

                IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 5858);
                UdpClient udpClient = new UdpClient(RemoteIpEndPoint);
                while (true) //由于Receive方法是阻塞方法,一个Receive操作完了后才能继续往下执行,所以能在这里使用死循环
                {
                    Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
                    string msg = Encoding.UTF8.GetString(receiveBytes);
                }

    使用BeginReceive(异步)

                   private static void InitializeUdpClient()
                  {               
    IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 5858); UdpClient udpClient = new UdpClient(RemoteIpEndPoint); //如果这里写while(true) 则会不停挂起异步接收操作,直到占满缓冲区间或队列。会报“由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作”的错 UdpState s = new UdpState(udpClient, RemoteIpEndPoint); udpClient.BeginReceive(EndReceive, s); } private static void EndReceive(IAsyncResult ar) { try { UdpState s = ar.AsyncState as UdpState; if (s != null) { UdpClient udpClient = s.UdpClient; IPEndPoint ip = s.IP; Byte[] receiveBytes = udpClient.EndReceive(ar, ref ip); string msg = Encoding.UTF8.GetString(receiveBytes); udpClient.BeginReceive(EndReceive, s);//在这里重新开始一个异步接收,用于处理下一个网络请求 } } catch (Exception ex) { //处理异常 } } public class UdpState { private UdpClient udpclient = null; public UdpClient UdpClient { get { return udpclient; } } private IPEndPoint ip; public IPEndPoint IP { get { return ip; } } public UdpState(UdpClient udpclient, IPEndPoint ip) { this.udpclient = udpclient; this.ip = ip; } }
  • 相关阅读:
    文件的序列化和反序列化
    三个小功能,游戏倒计时,文件的序列化和反序列化,txt文档的读取和写入
    Unity 中Debug打印的全局注释方式和重写
    导航制作的几个步骤
    Unity中删除文件目录下的所有文件和查看文件里面的内容
    VS2017一些小技巧
    在Unity中图标进行鼠标图标更换
    Electron-Vue 使用 oss 实现上传、下载
    Electron-Vue 调用本地数据库
    构建 Electron-Vue 脚手架项目
  • 原文地址:https://www.cnblogs.com/xyz0835/p/3835667.html
Copyright © 2011-2022 走看看