天堂国产午夜亚洲专区-少妇人妻综合久久蜜臀-国产成人户外露出视频在线-国产91传媒一区二区三区

當(dāng)前位置:主頁(yè) > 論文百科 > 核心期刊 >

C# Socket異步通信

發(fā)布時(shí)間:2016-05-07 10:01

  本文關(guān)鍵詞:異步通信,由筆耕文化傳播整理發(fā)布。


C# Socket異步通信 

                                                                     

TCPServer 

1、使用的通訊通道:socket

2、用到的基本功能:

Bind,

Listen,

BeginAccept

EndAccept

BeginReceive 

EndReceive

3、函數(shù)參數(shù)說明

 Socket listener = new Socket(AddressFamily.InterNetwork,

            SocketType.Stream, ProtocolType.Tcp);

 新建socket所使用的參數(shù)均為系統(tǒng)預(yù)定義的量,直接選取使用。

listener.Bind(localEndPoint);

localEndPoint 表示一個(gè)定義完整的終端,包括IP和端口信息。

//new IPEndPoint(IPAddress,port)

//IPAdress.Parse("192.168.1.3")

listener.Listen(100);

監(jiān)聽

    listener.BeginAccept(

                    new AsyncCallback(AcceptCallback),

                    listener);

  AsyncCallback(AcceptCallback),一旦連接上后的回調(diào)函數(shù)為AcceptCallback。當(dāng)系統(tǒng)調(diào)用這個(gè)函數(shù)時(shí),自動(dòng)賦予的輸入?yún)?shù)為IAsyncResoult類型變量ar。

   listener,連接行為的容器。

Socket handler = listener.EndAccept(ar);

完成連接,返回此時(shí)的socket通道。

handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,

            new AsyncCallback(ReadCallback), state);

接收的字節(jié),0,字節(jié)長(zhǎng)度,0,接收時(shí)調(diào)用的回調(diào)函數(shù),接收行為的容器。

========

容器的結(jié)構(gòu)類型為:

Code

容器至少為一個(gè)socket類型。

===============

  // Read data from the client socket.

        int bytesRead = handler.EndReceive(ar);

完成一次連接。數(shù)據(jù)存儲(chǔ)在state.buffer里,bytesRead為讀取的長(zhǎng)度。

handler.BeginSend(byteData, 0, byteData.Length, 0,

            new AsyncCallback(SendCallback), handler);

發(fā)送數(shù)據(jù)byteData,回調(diào)函數(shù)SendCallback。容器handler

int bytesSent = handler.EndSend(ar);

發(fā)送完畢,bytesSent發(fā)送字節(jié)數(shù)。

4 程序結(jié)構(gòu)

主程序:

Code

 連接行為回調(diào)函數(shù)AcceptCallback:

Code

    public static void AcceptCallback(IAsyncResult ar)

    {

        //添加此命令,,讓主線程繼續(xù).

        allDone.Set();

        // 獲取客戶請(qǐng)求的socket

        Socket listener = (Socket)ar.AsyncState;

        Socket handler = listener.EndAccept(ar);

        // 造一個(gè)容器,并用于接收命令.

        StateObject state = new StateObject();

        state.workSocket = handler;

        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,

            new AsyncCallback(ReadCallback), state);

    }

讀取行為的回調(diào)函數(shù)ReadCallback:

Code

    public static void ReadCallback(IAsyncResult ar)

    {

        String content = String.Empty;

        // 從異步state對(duì)象中獲取state和socket對(duì)象.

        StateObject state = (StateObject)ar.AsyncState;

        Socket handler = state.workSocket;

        // 從客戶socket讀取數(shù)據(jù).

        int bytesRead = handler.EndReceive(ar);

        if (bytesRead > 0)

        {

            // 如果接收到數(shù)據(jù),則存起來

            state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));

            // 檢查是否有結(jié)束標(biāo)記,如果沒有則繼續(xù)讀取

            content = state.sb.ToString();

            if (content.IndexOf("<EOF>") > -1)

            {

                //所有數(shù)據(jù)讀取完畢.

                Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",

                    content.Length, content);

                // 給客戶端響應(yīng).

                Send(handler, content);

            }

            else

            {

                // 接收未完成,繼續(xù)接收.

                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,

                new AsyncCallback(ReadCallback), state);

            }

        }

    }

發(fā)送消息給客戶端:

Code

private static void Send(Socket handler, String data)

    {

        // 消息格式轉(zhuǎn)換.

        byte[] byteData = Encoding.ASCII.GetBytes(data);

        // 開始發(fā)送數(shù)據(jù)給遠(yuǎn)程目標(biāo).

        handler.BeginSend(byteData, 0, byteData.Length, 0,

            new AsyncCallback(SendCallback), handler);

    }

private static void SendCallback(IAsyncResult ar)

    {

    

            // 從state對(duì)象獲取socket.

            Socket handler = (Socket)ar.AsyncState;

            //完成數(shù)據(jù)發(fā)送

            int bytesSent = handler.EndSend(ar);

            Console.WriteLine("Sent {0} bytes to client.", bytesSent);

            handler.Shutdown(SocketShutdown.Both);

            handler.Close();

    }

在各種行為的回調(diào)函數(shù)中,所對(duì)應(yīng)的socket都從輸入?yún)?shù)的AsyncState屬性獲得。使用(Socket)或者(StateObject)進(jìn)行強(qiáng)制轉(zhuǎn)換。BeginReceive函數(shù)使用的容器為state,因?yàn)樗枰娣艂魉偷臄?shù)據(jù)。

而其余接收或發(fā)送函數(shù)的容器為socket也可。

完整代碼


  本文關(guān)鍵詞:異步通信,由筆耕文化傳播整理發(fā)布。



本文編號(hào):42839

資料下載
論文發(fā)表

本文鏈接:http://sikaile.net/wenshubaike/jyzy/42839.html


Copyright(c)文論論文網(wǎng)All Rights Reserved | 網(wǎng)站地圖 |

版權(quán)申明:資料由用戶d274a***提供,本站僅收錄摘要或目錄,作者需要?jiǎng)h除請(qǐng)E-mail郵箱bigeng88@qq.com