博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UDP异步通信
阅读量:4704 次
发布时间:2019-06-10

本文共 8377 字,大约阅读时间需要 27 分钟。

先看效果图

Server:

using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;using System.Threading;namespace AsyncServer{    // 定义 UdpState类    public class UdpState    {        public UdpClient udpClient;        public IPEndPoint ipEndPoint;        public const int BufferSize = 1024;        public byte[] buffer = new byte[BufferSize];        public int counter = 0;    }    // 异步UDP类    public class AsyncUdpSever    {        // 定义节点        private IPEndPoint ipEndPoint = null;        private IPEndPoint remoteEP = null;        // 定义UDP发送和接收        private UdpClient udpReceive = null;        private UdpClient udpSend = null;        // 定义端口        private const int listenPort = 1100;        private const int remotePort = 1101;        UdpState udpReceiveState = null;        UdpState udpSendState = null;        // 异步状态同步        private ManualResetEvent sendDone = new ManualResetEvent(false);        private ManualResetEvent receiveDone = new ManualResetEvent(false);        public AsyncUdpSever()        {            // 本机节点            ipEndPoint = new IPEndPoint(IPAddress.Any, listenPort);            // 远程节点            //remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], remotePort);            // 实例化            remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), remotePort);            udpReceive = new UdpClient(ipEndPoint);            udpSend = new UdpClient();            // 分别实例化udpSendState、udpReceiveState            udpReceiveState = new UdpState();            udpReceiveState.udpClient = udpReceive;            udpReceiveState.ipEndPoint = ipEndPoint;            udpSendState = new UdpState();            udpSendState.udpClient = udpSend;            udpSendState.ipEndPoint = remoteEP;        }        public void ReceiveMsg()        {            Console.WriteLine("监听中....");            while (true)            {                lock (this)                {                    // 调用接收回调函数                    IAsyncResult iar = udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);                    receiveDone.WaitOne();                    Thread.Sleep(100);                }            }        }        // 接收回调函数        private void ReceiveCallback(IAsyncResult iar)        {            UdpState udpReceiveState = iar.AsyncState as UdpState;            if (iar.IsCompleted)            {                Byte[] receiveBytes = udpReceiveState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);                string receiveString = Encoding.ASCII.GetString(receiveBytes);                Console.WriteLine("接受数据: {0}", receiveString);                //Thread.Sleep(100);                receiveDone.Set();                SendMsg();            }        }        // 发送函数        private void SendMsg()        {            udpSend.Connect(udpSendState.ipEndPoint);            udpSendState.udpClient = udpSend;            udpSendState.counter++;            string message = string.Format("服务端:第{0}个UDP请求处理完成!", udpSendState.counter);            Byte[] sendBytes = Encoding.Unicode.GetBytes(message);            udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);            sendDone.WaitOne();        }        // 发送回调函数        private void SendCallback(IAsyncResult iar)        {            UdpState udpState = iar.AsyncState as UdpState;            Console.WriteLine("第{0}个请求处理完毕!", udpState.counter);            Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));            sendDone.Set();        }        // 主函数        public static void Main()        {            AsyncUdpSever aus = new AsyncUdpSever();            Thread t = new Thread(new ThreadStart(aus.ReceiveMsg));            t.Start();            Console.Read();        }    }}

客户端:

using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;using System.Threading;namespace AsyncClient{    // 定义 UdpState类    public class UdpState    {        public UdpClient udpClient = null;        public IPEndPoint ipEndPoint = null;        public const int BufferSize = 1024;        public byte[] buffer = new byte[BufferSize];        public int counter = 0;    }    // 异步UDP类    public class AsyncUdpClient    {        public static bool messageSent = false;        // Receive a message and write it to the console.        // 定义端口        private const int listenPort = 1101;        private const int remotePort = 1100;        // 定义节点        private IPEndPoint localEP = null;        private IPEndPoint remoteEP = null;        // 定义UDP发送和接收        private UdpClient udpReceive = null;        private UdpClient udpSend = null;        private UdpState udpSendState = null;        private UdpState udpReceiveState = null;        private int counter = 0;        // 异步状态同步        private ManualResetEvent sendDone = new ManualResetEvent(false);        private ManualResetEvent receiveDone = new ManualResetEvent(false);        // 定义套接字        //private Socket receiveSocket;        //private Socket sendSocket;        public AsyncUdpClient()        {            // 本机节点            localEP = new IPEndPoint(IPAddress.Any, listenPort);            // 远程节点            remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), remotePort);            // 实例化            udpReceive = new UdpClient(localEP);            udpSend = new UdpClient();            // 分别实例化udpSendState、udpReceiveState            udpSendState = new UdpState();            udpSendState.ipEndPoint = remoteEP;            udpSendState.udpClient = udpSend;            udpReceiveState = new UdpState();            udpReceiveState.ipEndPoint = remoteEP;            udpReceiveState.udpClient = udpReceive;            //receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);            //receiveSocket.Bind(localEP);            //sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);            //sendSocket.Bind(remoteEP);        }        // 发送函数        public void SendMsg()        {            udpSend.Connect(remoteEP);            //Thread t = new Thread(new ThreadStart(ReceiveMessages));            //t.Start();            Byte[] sendBytes;            string message;            while (true)            {                message = "Client" + (counter++).ToString();                lock (this)                {                    sendBytes = Encoding.ASCII.GetBytes(message);                    udpSendState.counter = counter;                    // 调用发送回调函数                    udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState);                    sendDone.WaitOne();                    Thread.Sleep(200);                    ReceiveMessages();                }            }        }        // 发送回调函数        public void SendCallback(IAsyncResult iar)        {            UdpState udpState = iar.AsyncState as UdpState;            if (iar.IsCompleted)            {                Console.WriteLine("客户端:第{0}个发送完毕!", udpState.counter);                Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar));                //if (udpState.counter == 10)                //{                //    udpState.udpClient.Close();                //}                sendDone.Set();            }        }        // 接收函数        public void ReceiveMessages()        {            lock (this)            {                udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState);                receiveDone.WaitOne();                Thread.Sleep(100);            }        }        // 接收回调函数        public void ReceiveCallback(IAsyncResult iar)        {            UdpState udpState = iar.AsyncState as UdpState;            if (iar.IsCompleted)            {                Byte[] receiveBytes = udpState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint);                string receiveString = Encoding.Unicode.GetString(receiveBytes);                Console.WriteLine("接受数据: {0}", receiveString);                receiveDone.Set();            }        }        // 主函数        public static void Main()        {            AsyncUdpClient auc = new AsyncUdpClient();            auc.SendMsg();            Console.Read();        }    }}

转载于:https://www.cnblogs.com/fanxingthink/p/6187873.html

你可能感兴趣的文章
设备常用框架framework
查看>>
bootstrap模态框和select2合用时input无法获取焦点(转)
查看>>
MockObject
查看>>
BZOJ4516: [Sdoi2016]生成魔咒(后缀自动机)
查看>>
查看手机已经记住的WIFI密码
查看>>
最新版IntelliJ IDEA2019 破解教程(2019.08.07-情人节更新)
查看>>
C# 两个datatable中的数据快速比较返回交集或差集
查看>>
关于oracle样例数据库emp、dept、salgrade的mysql脚本复杂查询分析
查看>>
adb shell am 的用法
查看>>
iOS10 UI教程视图和子视图的可见性
查看>>
FindChildControl与FindComponent
查看>>
中国城市json
查看>>
android下载手动下载Android SDK
查看>>
C++学习:任意合法状态下汉诺塔的移动(原创)
查看>>
leetcode133 - Clone Graph - medium
查看>>
一点小基础
查看>>
UNET学习笔记2 - 高级API(HLAPI)
查看>>
"ORA-00942: 表或视图不存在 "的原因和解决方法[转]
查看>>
Oauth支持的5类 grant_type 及说明
查看>>
C#中用DateTime的ParseExact方法解析日期时间(excel中使用系统默认的日期格式)
查看>>