C# Socket异步通讯实现详解

C# Socket异步通讯是如何实现的呢?C# Socket异步通讯客户端设计的思路是什么呢?那么本
首页 新闻资讯 行业资讯 C# Socket异步通讯实现详解

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

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

复制

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
// State object for receiving data from remote device.
public class StateObject {
// Client socket.
public Socket workSocket = null;
// Size of receive buffer.
public const int BufferSize = 256;
// Receive buffer.
public byte[] buffer = new byte[BufferSize];
// Received data string.
public StringBuilder sb = new StringBuilder();
}
public class AsynchronousClient {
// The port number for the remote device.
private const int port = 11000;
// ManualResetEvent instances signal completion.
private static ManualResetEvent connectDone =
new ManualResetEvent(false);
private static ManualResetEvent sendDone = new ManualResetEvent(false);
private static ManualResetEvent receiveDone =
new ManualResetEvent(false);
// The response from the remote device.
private static String response = String.Empty;
private static void StartClient() {
// Connect to a remote device.
 try {// Establish the remote endpoint for the socket.
// The name of the
// remote device is "host.contoso.com".
IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");
IPAddress ipAddress = ipHostInfo.AddressList[0];
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;  } 
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

  • 24.

  • 25.

  • 26.

  • 27.

  • 28.

  • 29.

  • 30.

  • 31.

  • 32.

  • 33.

  • 34.

  • 35.

  • 36.

  • 37.

  • 38.

  • 39.

  • 40.

  • 41.

  • 42.

  • 43.

  • 44.

  • 45.

  • 46.

  • 47.

  • 48.

  • 49.

  • 50.

  • 51.

  • 52.

  • 53.

  • 54.

  • 55.

  • 56.

  • 57.

  • 58.

  • 59.

  • 60.

  • 61.

  • 62.

  • 63.

  • 64.

  • 65.

  • 66.

  • 67.

  • 68.

  • 69.

  • 70.

  • 71.

  • 72.

  • 73.

  • 74.

  • 75.

  • 76.

  • 77.

  • 78.

  • 79.

  • 80.

  • 81.

  • 82.

  • 83.

  • 84.

  • 85.

  • 86.

  • 87.

  • 88.

  • 89.

  • 90.

  • 91.

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

复制

private static void ConnectCallback(IAsyncResult ar)  {   // 从state对象获取socket.  Socket client = (Socket)ar.AsyncState;   // 完成连接.  client.EndConnect(ar);   Console.WriteLine("Socket connected to {0}",  client.RemoteEndPoint.ToString());   // 连接已完成,主线程继续.  connectDone.Set();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

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

复制

   private static void Receive(Socket client)  try {{   // 构造容器state.  StateObject state = new StateObject();  state.workSocket = client;   // 从远程目标接收数据.  client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,  new AsyncCallback(ReceiveCallback), state);  } catch (Exception e) {
Console.WriteLine(e.ToString());
}
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();  }  } catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

  • 24.

  • 25.

  • 26.

  • 27.

  • 28.

  • 29.

  • 30.

  • 31.

  • 32.

  • 33.

  • 34.

  • 35.

  • 36.

  • 37.

  • 38.

  • 39.

  • 40.

  • 41.

  • 42.

  • 43.

  • 44.

  • 45.

  • 46.

  • 47.

  • 48.

  • 49.

  • 50.

  • 51.

  • 52.

  • 53.

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

复制

private static void Send(Socket client, String data)  {  // 格式转换.  byte[] byteData = Encoding.ASCII.GetBytes(data);   // 开始发送数据到远程设备.  client.BeginSend(byteData, 0, byteData.Length, 0,  new AsyncCallback(SendCallback), client);  }   private static void SendCallback(IAsyncResult ar)  {   // 从state对象中获取socket  Socket client = (Socket)ar.AsyncState;   // 完成数据发送.  int bytesSent = client.EndSend(ar);  Console.WriteLine("Sent {0} bytes to server.", bytesSent);   // 指示数据已经发送完成,主线程继续.  sendDone.Set();  } } catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
public static int Main(String[] args) {
StartClient();
return 0;
}
}
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

  • 24.

  • 25.

  • 26.

  • 27.

  • 28.

  • 29.

  • 30.

  • 31.

  • 32.

  • 33.

  • 34.

  • 35.

  • 36.

  • 37.

  • 38.

  • 39.

  • 40.

C# Socket异步通讯客户端的实现源码内容就基本向你介绍到这里,希望对你了解和学习C# Socket异步通讯有所帮助。

【编辑推荐】

  1. C#对象初始化学习总结

  2. C#改写方法学习笔记

  3. 概述C#加框和消框

  4. 浅析C#异步操作

  5. 描述C#异步Socket

 

9    2009-08-20 16:33:44    Socket异步通讯