c#之UDP协议的异步通信怎么做

c#之UDP协议的异步通信怎么做,第1张

UDP服务器:

using System;
using SystemText;
using SystemNet;
using SystemNetSockets;
namespace ConsoleUdpServer
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket socket = new Socket(AddressFamilyInterNetwork,
                SocketTypeDgram,
                ProtocolTypeUdp);
            EndPoint localEP = new IPEndPoint(IPAddressParse("127001"), 8002);
            socketBind(localEP);
            //启动异步接收
            State state = new State(socket);
            socketBeginReceiveFrom(
                stateBuffer, 0, stateBufferLength,
                SocketFlagsNone,
                ref stateRemoteEP,
                EndReceiveFromCallback,
                state);
            ConsoleReadLine();
            socketClose();
        }
        //异步接收回调函数
        static void EndReceiveFromCallback(IAsyncResult iar)
        {
            State state = iarAsyncState as State;
            Socket socket = stateSocket;
            try
            {
                //完成接收
                int byteRead = socketEndReceiveFrom(iar, ref stateRemoteEP);
                //显示客户端地址和端口
                ConsoleWriteLine("客户端终结点:{0}", stateRemoteEPToString());
                //显示接收信息
                ConsoleWriteLine("接收数据字节数:{0}", byteRead);
                string message = EncodingDefaultGetString(stateBuffer, 0, byteRead);
                ConsoleWriteLine("来着客户端信息:{0}", message);
                //向客户端发送信息
                SendMeaage(socket, stateRemoteEP, "成功接收!");
            }
            catch (Exception e)
            {
                ConsoleWriteLine("发生异常!异常信息:");
                ConsoleWriteLine(eMessage);
            }
            finally
            {
                //非常重要:继续异步接收
                socketBeginReceiveFrom(
                    stateBuffer, 0, stateBufferLength,
                    SocketFlagsNone,
                    ref stateRemoteEP,
                    EndReceiveFromCallback,
                    state);
            }
        }
        /// <summary>
        /// 向客户端发送信息
        /// </summary>
        /// <param name="socket">本地Socket(服务器Socket)</param>
        /// <param name="remoteEndPoint">客户端终结点</param>
        /// <param name="Message">信息</param>
        static void SendMeaage(Socket socket, EndPoint remoteEndPoint, string Message)
        {
            byte[] bytes = EncodingDefaultGetBytes(Message);
            socketSendTo(bytes, remoteEndPoint);
        }
    }
    /// <summary>
    /// 用于异步接收处理的辅助类
    /// </summary>
    class State
    {
        public State(Socket socket)
        {
            thisBuffer = new byte[1024];
            thisSocket = socket;
            thisRemoteEP = new IPEndPoint(IPAddressAny, 0);
        }
        /// <summary>
        /// 获取本机(服务器)Socket
        /// </summary>
        public Socket Socket { get; private set; }
        /// <summary>
        /// 获取接收缓冲区
        /// </summary>
        public byte[] Buffer { get; private set; }
        /// <summary>
        /// 获取/设置客户端终结点
        /// </summary>
        public EndPoint RemoteEP;
    }
}

UDP客户端

using System;
using SystemText;
using SystemNet;
using SystemNetSockets;
namespace ConsoleUdpClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket socket = new Socket(AddressFamilyInterNetwork,
                SocketTypeDgram,
                ProtocolTypeUdp);
            //客户端使用的终结点
            EndPoint localEP = new IPEndPoint(IPAddressAny, 0);
            socketBind(localEP);
            //启动异步接收
            State state = new State(socket);
            socketBeginReceiveFrom(
                stateBuffer, 0, stateBufferLength,
                SocketFlagsNone,
                ref stateRemoteEP,
                EndReceiveFromCallback,
                state);
            //向服务器发送信息
            EndPoint remoteEP = new IPEndPoint(IPAddressParse("127001"), 8002);
            SendMeaage(socket, remoteEP, "你好,这里是客户端,收到请回复!Over~~~~");
            ConsoleReadLine();
            socketClose();
        }
        //异步接收回调函数
        static void EndReceiveFromCallback(IAsyncResult iar)
        {
            State state = iarAsyncState as State;
            Socket socket = stateSocket;
            try
            {
                //完成接收
                int byteRead = socketEndReceiveFrom(iar, ref stateRemoteEP);
                //显示服务器地址和端口
                ConsoleWriteLine("服务器终结点:{0}", stateRemoteEPToString());
                //显示接收信息
                ConsoleWriteLine("接收数据字节数:{0}", byteRead);
                string message = EncodingDefaultGetString(stateBuffer, 0, byteRead);
                ConsoleWriteLine("来着服务器的信息:{0}", message);
            }
            catch (Exception e)
            {
                ConsoleWriteLine("发生异常!异常信息:");
                ConsoleWriteLine(eMessage);
            }
            finally
            {
                //非常重要:继续异步接收
                socketBeginReceiveFrom(
                    stateBuffer, 0, stateBufferLength,
                    SocketFlagsNone,
                    ref stateRemoteEP,
                    EndReceiveFromCallback,
                    state);
            }
        }
        /// <summary>
        /// 向服务器发送信息
        /// </summary>
        /// <param name="socket">本地Socket</param>
        /// <param name="remoteEndPoint">服务器终结点</param>
        /// <param name="Message">信息</param>
        static void SendMeaage(Socket socket, EndPoint remoteEndPoint, string Message)
        {
            byte[] bytes = EncodingDefaultGetBytes(Message);
            socketSendTo(bytes, remoteEndPoint);
        }
    }
    /// <summary>
    /// 用于异步接收处理的辅助类
    /// </summary>
    class State
    {
        public State(Socket socket)
        {
            thisBuffer = new byte[1024];
            thisSocket = socket;
            thisRemoteEP = new IPEndPoint(IPAddressAny, 0);
        }
        /// <summary>
        /// 获取本机Socket
        /// </summary>
        public Socket Socket { get; private set; }
        /// <summary>
        /// 获取接收缓冲区
        /// </summary>
        public byte[] Buffer { get; private set; }
        /// <summary>
        /// 获取/设置客户端终结点
        /// </summary>
        public EndPoint RemoteEP;
    }
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10494691.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存