C# Socket异步通讯客户端实现源码 C# Socket异步通讯客户端之主程序: 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: 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(); } //C# Socket异步通讯客户端之数据接收: 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(); } } //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(); } }