当前位置: 代码迷 >> C# >> C# Socket异步通信客户端之发送数据
  详细解决方案

C# Socket异步通信客户端之发送数据

热度:4596   发布时间:2013-02-25 00:00:00.0
C# Socket异步通讯客户端之发送数据

C# Socket异步通讯客户端之主程序:

[c-sharp] view plaincopyprint?
  1. # public static int Main(String[] args)    
  2. # {    
  3. #    
  4. # IPAddress ipAddress = IPAddress.Parse("192.168.1.104");    
  5. # int port = 20000;    
  6. # IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);    
  7. #    
  8. # // 生成一个TCP/IP socket.    
  9. # Socket client = new Socket(AddressFamily.InterNetwork,    
  10. # SocketType.Stream, ProtocolType.Tcp);    
  11. #    
  12. # // 与目标终端连接.    
  13. # client.BeginConnect(remoteEP,    
  14. # new AsyncCallback(ConnectCallback), client);    
  15. # //等待,直到连接程序完成。在ConnectCallback中适当位置有connecDone.Set()语句    
  16. # connectDone.WaitOne();    
  17. #    
  18. # // 发送数据到远程终端.    
  19. # Send(client, "This is a test<EOF>");    
  20. # sendDone.WaitOne();    
  21. #    
  22. # // 接收返回数据.    
  23. # Receive(client);    
  24. # receiveDone.WaitOne();    
  25. #    
  26. # // Write the response to the console.    
  27. # Console.WriteLine("Response received : {0}", response);    
  28. #    
  29. # // Release the socket.    
  30. # client.Shutdown(SocketShutdown.Both);    
  31. # client.Close();    
  32. #    
  33. # return 0;    
  34. #    

C# Socket异步通讯客户端之连接部分Callback:

[c-sharp] view plaincopyprint?
  1.  1. private static void ConnectCallback(IAsyncResult ar)    
  2.  2. {    
  3.  3.    
  4.  4. // 从state对象获取socket.    
  5.  5. Socket client = (Socket)ar.AsyncState;    
  6.  6.    
  7.  7. // 完成连接.    
  8.  8. client.EndConnect(ar);    
  9.  9.    
  10. 10. Console.WriteLine("Socket connected to {0}",    
  11. 11. client.RemoteEndPoint.ToString());    
  12. 12.    
  13. 13. // 连接已完成,主线程继续.    
  14. 14. connectDone.Set();    
  15. 15. }   

C# Socket异步通讯客户端之数据接收:

[c-sharp] view plaincopyprint?
  1. # private static void Receive(Socket client)    
  2. # {    
  3. #    
  4. # // 构造容器state.    
  5. # StateObject state = new StateObject();    
  6. # state.workSocket = client;    
  7. #    
  8. # // 从远程目标接收数据.    
  9. # client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,    
  10. # new AsyncCallback(ReceiveCallback), state);    
  11. #       
  12. # }    
  13. #    
  14. # private static void ReceiveCallback(IAsyncResult ar)    
  15. # {    
  16. #    
  17. # // 从输入参数异步state对象中获取state和socket对象    
  18. # StateObject state = (StateObject)ar.AsyncState;    
  19. # Socket client = state.workSocket;    
  20. #    
  21. # //从远程设备读取数据    
  22. # int bytesRead = client.EndReceive(ar);    
  23. #    
  24. # if (bytesRead > 0)    
  25. # {    
  26. # // 有数据,存储.    
  27. # state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));    
  28. #    
  29. # // 继续读取.    
  30. # client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,    
  31. # new AsyncCallback(ReceiveCallback), state);    
  32. # }    
  33. # else   
  34. # {    
  35. # // 所有数据读取完毕.    
  36. # if (state.sb.Length > 1)    
  37. # {    
  38. # response = state.sb.ToString();    
  39. # }    
  40. # // 所有数据读取完毕的指示信号.    
  41. # receiveDone.Set();    
  42. # }    
  43. #    
  44. # }   

C# Socket异步通讯客户端之发送数据:

[c-sharp] view plaincopyprint?
  1.  1. private static void Send(Socket client, String data)    
  2.  2. {    
  3.  3. // 格式转换.    
  4.  4. byte[] byteData = Encoding.ASCII.GetBytes(data);    
  5.  5.    
  6.  6. // 开始发送数据到远程设备.    
  7.  7. client.BeginSend(byteData, 0, byteData.Length, 0,    
  8.  8. new AsyncCallback(SendCallback), client);    
  9.  9. }    
  10. 10.    
  11. 11. private static void SendCallback(IAsyncResult ar)    
  12. 12. {    
  13. 13.    
  14. 14. // 从state对象中获取socket    
  15. 15. Socket client = (Socket)ar.AsyncState;    
  16. 16.    
  17. 17. // 完成数据发送.    
  18. 18. int bytesSent = client.EndSend(ar);    
  19. 19. Console.WriteLine("Sent {0} bytes to server.", bytesSent);    
  20. 20.    
  21. 21. // 指示数据已经发送完成,主线程继续.    
  22. 22. sendDone.Set();    
  23. 23.    
  24. 24. }  
  相关解决方案