• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Andren

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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

文章转至网络

posted on 2015-04-18 21:05  Andren  阅读(8026)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3