欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)udp異步通信程序示例

 更新時(shí)間:2014年04月16日 10:18:17   作者:  
這篇文章主要介紹了c#實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)udp異步通信程序示例,需要的朋友可以參考下

實(shí)現(xiàn)客戶(hù)端發(fā)送請(qǐng)求,服務(wù)器端響應(yīng)機(jī)制

UDP客戶(hù)端代碼

復(fù)制代碼 代碼如下:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Client
{
    class Program
    {
        //客戶(hù)端 Socket對(duì)象
        private static Socket clientSocket;
        //服務(wù)器端 終點(diǎn)
        private static EndPoint epServer;
        //接收數(shù)據(jù)的字符數(shù)組
        private static byte[] receiveData;

        public static void Main(string[] args)
        {
            //客戶(hù)端Socket對(duì)象實(shí)例化
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            //設(shè)置服務(wù)器端IP地址和對(duì)應(yīng)端口
            IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.1.165"), 11000);
            //實(shí)例化服務(wù)器端 終點(diǎn)
            epServer = (EndPoint)server;
            string msg;     //要發(fā)送的消息
            byte[] sendData;    //要發(fā)送的字符串
            while (true) {
                msg = Console.ReadLine();   //輸入要發(fā)送的消息
                if (msg == "exit") break;   //當(dāng)輸入“exit”時(shí),退出客戶(hù)端程序
                //將消息通過(guò)ASCII編碼轉(zhuǎn)換為字符數(shù)組,
                //如果要發(fā)送漢字或其他特殊符號(hào),可以采用UTF-8
                sendData = Encoding.ASCII.GetBytes(msg);   
                //開(kāi)始異步發(fā)送消息
                //參數(shù):sendData           要發(fā)送的數(shù)據(jù)
                //參數(shù):0:                 要發(fā)送數(shù)據(jù)的起始位置
                //參數(shù):sendData.Length:   要發(fā)送數(shù)據(jù)的字節(jié)數(shù)
                //參數(shù):SocketFlags.None:  按位組合方式
                //參數(shù):epServer:          接收方設(shè)備(包含IP和端口)
                //參數(shù):new AsyncCallback(SendData):   委托
                //參數(shù):null:          請(qǐng)求的狀態(tài)信息
                clientSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
                    epServer, new AsyncCallback(SendData), null);
                //實(shí)例化接收數(shù)據(jù)的字符數(shù)組
                //若在聲明時(shí)已經(jīng)初始化,此處依然要進(jìn)行重新初始化
                //當(dāng)上次接收的數(shù)據(jù)長(zhǎng)度大于本次,則該數(shù)組里包含上次接收的殘留數(shù)據(jù)
                //比如:上次接收“你個(gè)小逗逼”。本次接收“開(kāi)玩笑”。
                //則數(shù)組中的數(shù)據(jù)為:“開(kāi)玩笑逗逼”。
                receiveData = new byte[1024];
                //開(kāi)始異步接收消息
                //參數(shù)部分與異步發(fā)送部分對(duì)應(yīng),基本一致
                clientSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
                    ref epServer, new AsyncCallback(ReceiveData), null);
            }
        }

        //異步發(fā)送消息的委托函數(shù)
        private static void SendData(IAsyncResult iar)
        {
            //完成異步發(fā)送
            clientSocket.EndSend(iar);
        }

        //異步接收消息的委托函數(shù)
        private static void ReceiveData(IAsyncResult iar)
        {
            //完成異步接收  recv 表示接收到的字節(jié)數(shù)
            int recv = clientSocket.EndReceive(iar);
            //將接收到的數(shù)據(jù)打印出來(lái)
            Console.WriteLine("Server: " + Encoding.ASCII.GetString(receiveData, 0, recv));
        }

    }
}

UDP服務(wù)器端代碼

復(fù)制代碼 代碼如下:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Server
{
    class AsyncUdpServer
    {
        //服務(wù)器端Socket對(duì)象
        private static Socket serverSocket;
        //接收數(shù)據(jù)的字符數(shù)組
        private static byte[] receiveData = new byte[1024];

        public static void Main(string[] args)
        {
            //實(shí)例化服務(wù)器端Socket對(duì)象
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            //服務(wù)器端的IP和端口,IPAddress.Any實(shí)際是:0.0.0.0,表示任意,基本上表示本機(jī)IP
            IPEndPoint server = new IPEndPoint(IPAddress.Any, 11000);
            //Socket對(duì)象跟服務(wù)器端的IP和端口綁定
            serverSocket.Bind(server);
            //客戶(hù)端的IP和端口,端口 0 表示任意端口
            IPEndPoint clients = new IPEndPoint(IPAddress.Any, 0);
            //實(shí)例化客戶(hù)端 終點(diǎn)
            EndPoint epSender = (EndPoint)clients;
            //開(kāi)始異步接收消息  接收后,epSender存儲(chǔ)的是發(fā)送方的IP和端口
            serverSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
                ref epSender, new AsyncCallback(ReceiveData), epSender);
            Console.WriteLine("Listening...");
            Console.ReadLine();
        }

        private static void SendData(IAsyncResult iar)
        {
            serverSocket.EndSend(iar);
        }

        private static void ReceiveData(IAsyncResult iar)
        {
            //客戶(hù)端的IP和端口,端口 0 表示任意端口
            IPEndPoint client = new IPEndPoint(IPAddress.Any, 0);
            //實(shí)例化客戶(hù)端 終點(diǎn)
            EndPoint epSender = (EndPoint)client;
            //結(jié)束異步接收消息  recv 表示接收到的字符數(shù)
            int recv = serverSocket.EndReceiveFrom(iar, ref epSender);           
            //將接收到的數(shù)據(jù)打印出來(lái),發(fā)送方采用什么編碼方式,此處就采用什么編碼方式 轉(zhuǎn)換成字符串
            Console.WriteLine("Client:" + Encoding.ASCII.GetString(receiveData, 0, recv));
            //定義要發(fā)送回客戶(hù)端的消息,采用ASCII編碼,
            //如果要發(fā)送漢字或其他特殊符號(hào),可以采用UTF-8           
            byte[] sendData = Encoding.ASCII.GetBytes("hello");
            //開(kāi)始異步發(fā)送消息  epSender是上次接收消息時(shí)的客戶(hù)端IP和端口信息
            serverSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
                epSender, new AsyncCallback(SendData), epSender);
            //重新實(shí)例化接收數(shù)據(jù)字節(jié)數(shù)組
            receiveData = new byte[1024];
            //開(kāi)始異步接收消息,此處的委托函數(shù)是這個(gè)函數(shù)本身,遞歸
            serverSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
                ref epSender, new AsyncCallback(ReceiveData), epSender);
        }

    }
}

相關(guān)文章

最新評(píng)論