亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

詳解C# Socket異步通信實例

2020-01-24 00:53:34
字體:
來源:轉載
供稿:網友

TCPServer 

1、使用的通訊通道:socket

2、用到的基本功能:

①Bind,

②Listen,

③BeginAccept

④EndAccept

⑤BeginReceive 

⑥EndReceive

3、函數參數說明

 Socket listener = new Socket(AddressFamily.InterNetwork,      SocketType.Stream, ProtocolType.Tcp);

新建socket所使用的參數均為系統預定義的量,直接選取使用。

listener.Bind(localEndPoint);

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

//new IPEndPoint(IPAddress,port)//IPAdress.Parse("192.168.1.3")listener.Listen(100);

監聽

  listener.BeginAccept(          new AsyncCallback(AcceptCallback),          listener);

AsyncCallback(AcceptCallback),一旦連接上后的回調函數為AcceptCallback。當系統調用這個函數時,自動賦予的輸入參數為IAsyncResoult類型變量ar。

 listener,連接行為的容器。

Socket handler = listener.EndAccept(ar);

完成連接,返回此時的socket通道。

handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,      new AsyncCallback(ReadCallback), state);

接收的字節,0,字節長度,0,接收時調用的回調函數,接收行為的容器。

========

容器的結構類型為:

public class StateObject{  // Client socket.  public Socket workSocket = null;  // Size of receive buffer.  public const int BufferSize = 1024;  // Receive buffer.  public byte[] buffer = new byte[BufferSize];  // Received data string.  public StringBuilder sb = new StringBuilder();}

容器至少為一個socket類型。

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

 // Read data from the client socket.     int bytesRead = handler.EndReceive(ar);

完成一次連接。數據存儲在state.buffer里,bytesRead為讀取的長度。

handler.BeginSend(byteData, 0, byteData.Length, 0,      new AsyncCallback(SendCallback), handler);

發送數據byteData,回調函數SendCallback。容器handler

int bytesSent = handler.EndSend(ar);

發送完畢,bytesSent發送字節數。

4 程序結構

主程序:

    byte[] bytes = new Byte[1024];    IPAddress ipAddress = IPAddress.Parse("192.168.1.104");    IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);    // 生成一個TCP的socket    Socket listener = new Socket(AddressFamily.InterNetwork,      SocketType.Stream, ProtocolType.Tcp);    listener.Bind(localEndPoint);    listener.Listen(100);    while (true)    {      // Set the event to nonsignaled state.      allDone.Reset();      //開啟異步監聽socket      Console.WriteLine("Waiting for a connection");      listener.BeginAccept(           new AsyncCallback(AcceptCallback),           listener);      // 讓程序等待,直到連接任務完成。在AcceptCallback里的適當位置放置allDone.Set()語句.      allDone.WaitOne();      }  Console.WriteLine("/nPress ENTER to continue");  Console.Read();

連接行為回調函數AcceptCallback:

  public static void AcceptCallback(IAsyncResult ar)  {    //添加此命令,讓主線程繼續.    allDone.Set();    // 獲取客戶請求的socket    Socket listener = (Socket)ar.AsyncState;    Socket handler = listener.EndAccept(ar);    // 造一個容器,并用于接收命令.    StateObject state = new StateObject();    state.workSocket = handler;    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,      new AsyncCallback(ReadCallback), state);  }

讀取行為的回調函數ReadCallback:

  public static void ReadCallback(IAsyncResult ar)  {    String content = String.Empty;    // 從異步state對象中獲取state和socket對象.    StateObject state = (StateObject)ar.AsyncState;    Socket handler = state.workSocket;    // 從客戶socket讀取數據.     int bytesRead = handler.EndReceive(ar);    if (bytesRead > 0)    {      // 如果接收到數據,則存起來      state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));      // 檢查是否有結束標記,如果沒有則繼續讀取      content = state.sb.ToString();      if (content.IndexOf("<EOF>") > -1)      {        //所有數據讀取完畢.        Console.WriteLine("Read {0} bytes from socket. /n Data : {1}",          content.Length, content);        // 給客戶端響應.        Send(handler, content);      }      else      {        // 接收未完成,繼續接收.        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,        new AsyncCallback(ReadCallback), state);      }    }  }

發送消息給客戶端:

private static void Send(Socket handler, String data)  {    // 消息格式轉換.    byte[] byteData = Encoding.ASCII.GetBytes(data);    // 開始發送數據給遠程目標.    handler.BeginSend(byteData, 0, byteData.Length, 0,      new AsyncCallback(SendCallback), handler);  }private static void SendCallback(IAsyncResult ar)  {         // 從state對象獲取socket.      Socket handler = (Socket)ar.AsyncState;      //完成數據發送      int bytesSent = handler.EndSend(ar);      Console.WriteLine("Sent {0} bytes to client.", bytesSent);      handler.Shutdown(SocketShutdown.Both);      handler.Close();  }

在各種行為的回調函數中,所對應的socket都從輸入參數的AsyncState屬性獲得。使用(Socket)或者(StateObject)進行強制轉換。BeginReceive函數使用的容器為state,因為它需要存放傳送的數據。

而其余接收或發送函數的容器為socket也可。

完整代碼

  using System;  using System.Net;  using System.Net.Sockets;  using System.Text;  using System.Threading;    // State object for reading client data asynchronously  public class StateObject  {   // Client socket.   public Socket workSocket = null;   // Size of receive buffer.   public const int BufferSize = ;   // Receive buffer.   public byte[] buffer = new byte[BufferSize];   // Received data string.   public StringBuilder sb = new StringBuilder(); }  public class AsynchronousSocketListener {   // Thread signal.   public static ManualResetEvent allDone = new ManualResetEvent(false);    public AsynchronousSocketListener()   {   }    public static void StartListening()   {     // Data buffer for incoming data.     byte[] bytes = new Byte[];      // Establish the local endpoint for the socket.     // The DNS name of the computer     // running the listener is "host.contoso.com".     //IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());     IPAddress ipAddress = IPAddress.Parse("...");      IPEndPoint localEndPoint = new IPEndPoint(ipAddress, );      // Create a TCP/IP socket.     Socket listener = new Socket(AddressFamily.InterNetwork,       SocketType.Stream, ProtocolType.Tcp);      // Bind the socket to the local endpoint and listen for incoming connections.     try     {       listener.Bind(localEndPoint);       listener.Listen();       while (true)       {         // Set the event to nonsignaled state.         allDone.Reset();          // Start an asynchronous socket to listen for connections.         Console.WriteLine("Waiting for a connection");         listener.BeginAccept(           new AsyncCallback(AcceptCallback),           listener);          // Wait until a connection is made before continuing.         allDone.WaitOne();       }     }     catch (Exception e)     {       Console.WriteLine(e.ToString());     }      Console.WriteLine("/nPress ENTER to continue");     Console.Read();   }    public static void AcceptCallback(IAsyncResult ar)   {     // Signal the main thread to continue.     allDone.Set();      // Get the socket that handles the client request.     Socket listener = (Socket)ar.AsyncState;     Socket handler = listener.EndAccept(ar);       // Create the state object.     StateObject state = new StateObject();     state.workSocket = handler;     handler.BeginReceive(state.buffer, , StateObject.BufferSize, , new AsyncCallback(ReadCallback), state);   }    public static void ReadCallback(IAsyncResult ar)   {     String content = String.Empty;         // Retrieve the state object and the handler socket     // from the asynchronous state object.     StateObject state = (StateObject)ar.AsyncState;     Socket handler = state.workSocket;      // Read data from the client socket.      int bytesRead = handler.EndReceive(ar);      if (bytesRead > )     {       // There might be more data, so store the data received so far.       state.sb.Append(Encoding.ASCII.GetString(         state.buffer, , bytesRead));        // Check for end-of-file tag. If it is not there, read        // more data.       content = state.sb.ToString();       if (content.IndexOf("<EOF>") > -)       {         // All the data has been read from the          // client. Display it on the console.         Console.WriteLine("Read {} bytes from socket. /n Data : {}",content.Length, content);          // Echo the data back to the client.         Send(handler, content);       }       else       {         // Not all data received. Get more.         handler.BeginReceive(state.buffer, , StateObject.BufferSize, , new AsyncCallback(ReadCallback), state);       }     }   }    private static void Send(Socket handler, String data)   {     // Convert the string data to byte data using ASCII encoding.     byte[] byteData = Encoding.ASCII.GetBytes(data);      // Begin sending the data to the remote device.     handler.BeginSend(byteData, , byteData.Length, ,       new AsyncCallback(SendCallback), handler);   }      private static void SendCallback(IAsyncResult ar)    {     try     {       // Retrieve the socket from the state object.       Socket handler = (Socket)ar.AsyncState;        // Complete sending the data to the remote device.       int bytesSent = handler.EndSend(ar);       Console.WriteLine("Sent {} bytes to client.", bytesSent);       handler.Shutdown(SocketShutdown.Both);       handler.Close();     }      catch (Exception e)      {       Console.WriteLine(e.ToString());     }   }    public static int Main(String[] args)    {     StartListening();     return ;   }  }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
xvideos亚洲| 97人人模人人爽人人喊中文字| 国产在线精品一区免费香蕉| 精品亚洲一区二区三区| 亚洲国产美女精品久久久久∴| 日韩高清免费观看| 欧美中文在线免费| 欧美大片va欧美在线播放| 亚洲aⅴ男人的天堂在线观看| 亚洲精品视频免费| 久久免费观看视频| 国内成人精品视频| 久久久久中文字幕2018| 精品日本美女福利在线观看| 日本成熟性欧美| 91精品国产九九九久久久亚洲| 北条麻妃99精品青青久久| 国产成人欧美在线观看| 亚洲第一区中文字幕| 国产成人精品一区二区在线| 欧美日韩亚洲系列| 亚洲国产日韩一区| 亚洲va久久久噜噜噜| 欧美激情久久久久久| 亚洲国语精品自产拍在线观看| 久久香蕉精品香蕉| 97视频在线观看亚洲| 欧美日韩国产麻豆| 欧美极品少妇xxxxⅹ喷水| 黑人精品xxx一区| 亚洲永久在线观看| 综合av色偷偷网| 久久精品电影一区二区| 日本欧美一二三区| 98精品国产高清在线xxxx天堂| 国产精品久久久久久亚洲影视| 国产精品久久中文| 性欧美激情精品| 51色欧美片视频在线观看| 最近2019中文字幕一页二页| 国产精品美女www| 热久久免费国产视频| 亚洲国产欧美一区二区三区久久| 美女少妇精品视频| 中文字幕久久久av一区| 国产欧美精品在线播放| 日韩av在线网页| 国产女人18毛片水18精品| 亚洲香蕉伊综合在人在线视看| 亚洲最大的av网站| 亚洲欧美日韩中文在线制服| 日韩欧美视频一区二区三区| 97在线免费观看| 91色视频在线观看| 成人亲热视频网站| 国产视频999| 亚洲人成电影在线播放| 伊人久久精品视频| 亚洲一区制服诱惑| 国产精品美女久久久久久免费| 欧美精品日韩www.p站| 久久影院资源网| 国内精品久久影院| 亚洲free嫩bbb| 成人在线中文字幕| 国产91九色视频| 国产成人精品免费久久久久| 日韩精品在线视频美女| 国产精品青青在线观看爽香蕉| 日韩在线欧美在线| 亚洲国产女人aaa毛片在线| 亚洲天堂一区二区三区| 国产午夜精品视频| 精品毛片网大全| 国产精品白丝av嫩草影院| 97国产精品视频| 一区二区三区久久精品| 久久伊人91精品综合网站| 国产精品欧美风情| 欧美性高潮在线| 久久久精品久久久| 久久精品这里热有精品| 欧美高清一级大片| 欧美激情亚洲激情| 亚洲高清久久久久久| 亚洲jizzjizz日本少妇| 91精品视频在线| 国产精品999| 色婷婷亚洲mv天堂mv在影片| 国产精品扒开腿爽爽爽视频| 一区国产精品视频| 久久91亚洲精品中文字幕奶水| 91亚洲一区精品| 九九久久久久99精品| 91在线无精精品一区二区| 国产精品久久久999| 国产精品视频一区国模私拍| 日韩视频永久免费观看| 日韩av在线免费播放| 日韩av在线导航| 亚洲美腿欧美激情另类| 国产精品精品视频一区二区三区| 亚洲天堂av电影| 日韩欧美黄色动漫| 韩日精品中文字幕| 欧美日韩中国免费专区在线看| 国产成人一区二区在线| 中日韩美女免费视频网址在线观看| 人妖精品videosex性欧美| 91在线视频成人| 国产亚洲免费的视频看| 91天堂在线观看| 国产精品视频在线播放| 岛国av午夜精品| 国产一区二区在线免费视频| 成人午夜黄色影院| 成人免费看片视频| 日韩欧美在线播放| 欧美成年人视频网站欧美| 欧美日韩精品在线播放| 国产精品日韩欧美综合| 亚洲国模精品私拍| 成人网在线免费观看| 久久精品国产久精国产思思| 欧美激情精品久久久久久| 亚洲深夜福利视频| 午夜精品久久久久久久99黑人| 精品日本美女福利在线观看| 久久精品亚洲精品| 国产日韩换脸av一区在线观看| 国产精品国产福利国产秒拍| 一本色道久久88精品综合| 亚洲欧美国内爽妇网| 欧美性猛交xxxx免费看漫画| 欧美与欧洲交xxxx免费观看| 亚洲高清久久久久久| 日韩精品视频免费专区在线播放| 亚洲精品中文字幕av| 国产成+人+综合+亚洲欧美丁香花| 欧美日韩中文在线| 国产精品日韩在线一区| 欧美亚洲一级片| 国产精品丝袜白浆摸在线| 日韩在线精品视频| 日韩一二三在线视频播| 国产在线不卡精品| 久久成年人视频| 欧美成人手机在线| 国产成人精彩在线视频九色| 日韩av综合网站| 日韩欧美第一页| 91在线视频免费| 国产欧美一区二区三区在线看| 亚洲国产精品va在线看黑人动漫| 国产视频丨精品|在线观看| 成人在线一区二区| 欧美日韩国产在线看| 国产亚洲激情在线| 亚洲无亚洲人成网站77777| 成人激情电影一区二区| 日韩成人网免费视频| 国产精品偷伦免费视频观看的| 欧美久久精品午夜青青大伊人| 日韩av在线播放资源|