C# 通過UDP進行異步通信的實例代碼

mb78 9年前發布 | 4K 次閱讀 C#

C# 通過UDP進行異步通信的實例代碼

服務器端:

using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace AsyncServer { public class UdpState { public UdpClient udpClient; public IPEndPoint ipEndPoint; public const int BufferSize = 1024; public byte[] buffer = new byte[BufferSize]; public int counter = 0; } public class AsyncUdpSever { private IPEndPoint ipEndPoint = null; private IPEndPoint remoteEP = null; 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); udpReceive = new UdpClient(ipEndPoint); udpSend = new UdpClient(); udpReceiveState = new UdpState();
udpReceiveState.udpClient = udpReceive; udpReceiveState.ipEndPoint = ipEndPoint;

        udpSendState = new UdpState();
        udpSendState.udpClient = udpSend;
        udpSendState.ipEndPoint = remoteEP;
    }
    public void ReceiveMsg()
    {
        Console.WriteLine("listening for messages");
        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("Received: {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 { 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; } 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; 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(Dns.GetHostAddresses(Dns.GetHostName())[0],remotePort); udpReceive = new UdpClient(localEP);
udpSend = new UdpClient();

        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("Received: {0}", receiveString);
            receiveDone.Set();
        }           
    }

    public static void Main()
    {
        AsyncUdpClient auc = new AsyncUdpClient();
        auc.SendMsg();
        Console.Read();
    }
}

}</pre>

 本文由用戶 mb78 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!