C# Socket異步通訊客戶端之主程序: [c-sharp] # public static int Main(String[] args) # { # # IPAddress ipAddress = IPAddress.Parse("192.168.1.104"); # int port = 20000; # IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); # # // 生成一個TCP/IP socket. # Socket client = new Socket(AddressFamily.InterNetwork, # SocketType.Stream, ProtocolType.Tcp); # # // 與目標終端連接. # client.BeginConnect(remoteEP, # new AsyncCallback(ConnectCallback), client); # //等待,直到連接程序完成。在ConnectCallback中適當位置有connecDone.Set()語句 # connectDone.WaitOne(); # # // 發送數據到遠程終端. # Send(client, "This is a test<EOF>"); # sendDone.WaitOne(); # # // 接收返回數據. # Receive(client); # receiveDone.WaitOne(); # # // Write the response to the console. # Console.WriteLine("Response received : {0}", response); # # // Release the socket. # client.Shutdown(SocketShutdown.Both); # client.Close(); # # return 0; # C# Socket異步通訊客戶端之連接部分Callback: [c-sharp] 1. private static void ConnectCallback(IAsyncResult ar) 2. { 3. 4. // 從state對象獲取socket. 5. Socket client = (Socket)ar.AsyncState; 6. 7. // 完成連接. 8. client.EndConnect(ar); 9. 10. Console.WriteLine("Socket connected to {0}", 11. client.RemoteEndPoint.ToString()); 12. 13. // 連接已完成,主線程繼續. 14. connectDone.Set(); 15. } C# Socket異步通訊客戶端之數據接收: [c-sharp] # private static void Receive(Socket client) # { # # // 構造容器state. # StateObject state = new StateObject(); # state.workSocket = client; # # // 從遠程目標接收數據. # client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, # new AsyncCallback(ReceiveCallback), state); # # } # # private static void ReceiveCallback(IAsyncResult ar) # { # # // 從輸入參數異步state對象中獲取state和socket對象 # StateObject state = (StateObject)ar.AsyncState; # Socket client = state.workSocket; # # //從遠程設備讀取數據 # int bytesRead = client.EndReceive(ar); # # if (bytesRead > 0) # { # // 有數據,存儲. # state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); # # // 繼續讀取. # client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, # new AsyncCallback(ReceiveCallback), state); # } # else # { # // 所有數據讀取完畢. # if (state.sb.Length > 1) # { # response = state.sb.ToString(); # } # // 所有數據讀取完畢的指示信號. # receiveDone.Set(); # } # # } www.2cto.com C# Socket異步通訊客戶端之發送數據: [c-sharp] view plaincopy www.2cto.com 1. private static void Send(Socket client, String data) 2. { 3. // 格式轉換. 4. byte[] byteData = Encoding.ASCII.GetBytes(data); 5. 6. // 開始發送數據到遠程設備. 7. client.BeginSend(byteData, 0, byteData.Length, 0, 8. new AsyncCallback(SendCallback), client); 9. } 10. 11. private static void SendCallback(IAsyncResult ar) 12. { 13. 14. // 從state對象中獲取socket 15. Socket client = (Socket)ar.AsyncState; 16. 17. // 完成數據發送. 18. int bytesSent = client.EndSend(ar); 19. Console.WriteLine("Sent {0} bytes to server.", bytesSent); 20. 21. // 指示數據已經發送完成,主線程繼續. 22. sendDone.Set(); 23. 24. }