分享

C# Socket异步通讯实现详解

 haodafeng_org 2012-05-04

C# Socket异步通讯客户端实现源码

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

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

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

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

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

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

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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多