Code Server端代码: using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace ConsoleServer { publicclass StateObject { // Client socket. public Socket workSocket =null; // Size of receive buffer. publicconstint BufferSize =1024; // Receive buffer. publicbyte[] buffer =newbyte[BufferSize]; // Received data string. public StringBuilder sb =new StringBuilder(); } class Program { publicstatic ManualResetEvent allDone =new ManualResetEvent(false); /**////<summary> ///监听 /// 并开始接受网络连接请求的方法 ///</summary> publicstaticvoid StartListening() { Console.WriteLine("监听时的线程:"+ Thread.CurrentThread.ManagedThreadId.ToString()); // Data buffer for incoming data. byte[] bytes =new Byte[1024]; // Establish the local endpoint for the socket. // The DNS name of the computer // running the listener is "host.contoso.com". IPHostEntry ipHostInfo = Dns.Resolve("127.0.0.1"); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint localEndPoint =new IPEndPoint(ipAddress, 9090); // 创建一个tcp/ip socket Socket listener =new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Bind the socket to the local endpoint and listen for incoming connections. try { listener.Bind(localEndPoint); Console.WriteLine("Listen1: "+ Thread.CurrentThread.ManagedThreadId.ToString()); listener.Listen(100); Console.WriteLine("Listen2: "+ Thread.CurrentThread.ManagedThreadId.ToString()); while (true) { Console.WriteLine("1: "+ Thread.CurrentThread.ManagedThreadId.ToString()); // Set the event to nonsignaled state.设置为无信号状态 allDone.Reset(); Console.WriteLine("2: "+ Thread.CurrentThread.ManagedThreadId.ToString()); // Start an asynchronous socket to listen for connections. Console.WriteLine("Waiting for a connection"); //开始建立连接 listener.BeginAccept( new AsyncCallback(AcceptCallback), listener); Console.WriteLine("3: "+ Thread.CurrentThread.ManagedThreadId.ToString()); // Wait until a connection is made before continuing. allDone.WaitOne(); Console.WriteLine("4: "+ Thread.CurrentThread.ManagedThreadId.ToString()); } } catch (Exception e) { Console.WriteLine(e.ToString()); } Console.WriteLine("/nPress ENTER to continue"); Console.Read(); } /**////<summary> /// 处理连接请求 /// 并开始接收网络数据的回调方法 ///</summary> ///<param name="ar"></param> publicstaticvoid AcceptCallback(IAsyncResult ar) { // Signal the main thread to continue. allDone.Set(); Console.WriteLine("AcceptCallback1线程ID为: "+ Thread.CurrentThread.ManagedThreadId.ToString()); // Get the socket that handles the client request. Socket listener = (Socket)ar.AsyncState; //建立socket通道,连接建立完成 Socket handler = listener.EndAccept(ar); // Create the state object.创建一个状态对象,开始接受数据 StateObject state =new StateObject(); state.workSocket = handler; handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); Console.WriteLine("AcceptCallback2线程ID为: "+ Thread.CurrentThread.ManagedThreadId.ToString()); } /**////<summary> /// 结束接收数据的回调方法 ///</summary> ///<param name="ar"></param> publicstaticvoid ReadCallback(IAsyncResult ar) { Console.WriteLine("ReadCallback线程ID为: "+ Thread.CurrentThread.ManagedThreadId.ToString()); String content = String.Empty; // Retrieve the state object and the handler socket // from the asynchronous state object. StateObject state = (StateObject)ar.AsyncState; Socket handler = state.workSocket; // Read data from the client socket.从socket通道里读取数据 int bytesRead = handler.EndReceive(ar); if (bytesRead >0) { // There might be more data, so store the data received so far. state.sb.Append(Encoding.ASCII.GetString( state.buffer, 0, bytesRead)); // Check for end-of-file tag. If it is not there, read // more data. content = state.sb.ToString(); if (content.IndexOf("<EOF>") >-1) { // All the data has been read from the // client. Display it on the console. Console.WriteLine("Read {0} bytes from socket. /n Data : {1}", content.Length, content); Console.WriteLine("请输入要发送的信息:"); string str = Console.ReadLine(); Send(handler, str +"<EOF>"); //Send(handler, content); } else { // Not all data received. Get more. handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); } } } /**////<summary> /// 开始发送数据的方法 ///</summary> ///<param name="handler"></param> ///<param name="data"></param> privatestaticvoid Send(Socket handler, String data) { // Convert the string data to byte data using ASCII encoding. byte[] byteData = Encoding.ASCII.GetBytes(data); // Begin sending the data to the remote device. handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler); } /**////<summary> /// 结束发送数据的回调方法 ///</summary> ///<param name="ar"></param> privatestaticvoid SendCallback(IAsyncResult ar) { Console.WriteLine("SendCallback线程ID为: "+ Thread.CurrentThread.ManagedThreadId.ToString()); try { // Retrieve the socket from the state object. Socket handler = (Socket)ar.AsyncState; // Complete sending the data to the remote device. int bytesSent = handler.EndSend(ar); Console.WriteLine("Sent {0} bytes to client.", bytesSent); //没有了这两句,server是发不出去的,为什么呢? handler.Shutdown(SocketShutdown.Both); handler.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } staticvoid Main(string[] args) { Console.WriteLine("main线程ID为: "+ Thread.CurrentThread.ManagedThreadId.ToString()); StartListening(); Console.ReadLine(); } } } 客户端代码: using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Threading; using System.Net; namespace WindowsClient { publicclass StateObject { // Client socket. public Socket workSocket =null; // Size of receive buffer. publicconstint BufferSize =256; // Receive buffer. publicbyte[] buffer =newbyte[BufferSize]; // Received data string. public StringBuilder sb =new StringBuilder(); } class Program { // The port number for the remote device. privateconstint port =9090; // ManualResetEvent instances signal completion. privatestatic ManualResetEvent connectDone = new ManualResetEvent(false); privatestatic ManualResetEvent sendDone = new ManualResetEvent(false); privatestatic ManualResetEvent receiveDone = new ManualResetEvent(false); // The response from the remote device. privatestatic String response = String.Empty; privatestaticvoid StartClient() { string str =string.Empty; // 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("127.0.0.1"); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint remoteEP =new IPEndPoint(ipAddress, port); // Create a TCP/IP socket. Socket client =new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Connect to the remote endpoint. client.BeginConnect( remoteEP, new AsyncCallback(ConnectCallback), client); connectDone.WaitOne(); Console.WriteLine("请输入要发送的信息:"); // str = Console.ReadLine(); // Send test data to the remote device. Send(client, str +"<EOF>");//"This is a test<EOF>"); sendDone.WaitOne(); // Receive the response from the remote device. 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(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } privatestaticvoid ConnectCallback(IAsyncResult ar) { try { // Retrieve the socket from the state object. Socket client = (Socket) ar.AsyncState; // Complete the connection. client.EndConnect(ar); Console.WriteLine("Socket connected to {0}", client.RemoteEndPoint.ToString()); // Signal that the connection has been made. connectDone.Set(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } privatestaticvoid Receive(Socket client) { try { // Create the state object. StateObject state =new StateObject(); state.workSocket = client; // Begin receiving the data from the remote device. client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } catch (Exception e) { Console.WriteLine(e.ToString()); } } privatestaticvoid ReceiveCallback( IAsyncResult ar ) { try { // Retrieve the state object and the client socket // from the asynchronous state object. StateObject state = (StateObject) ar.AsyncState; Socket client = state.workSocket; // Read data from the remote device. int bytesRead = client.EndReceive(ar); if (bytesRead >0) { // There might be more data, so store the data received so far. state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead)); // Get the rest of the data. client.BeginReceive(state.buffer,0,StateObject.BufferSize,0, new AsyncCallback(ReceiveCallback), state); } else { // All the data has arrived; put it in response. if (state.sb.Length >1) { response = state.sb.ToString(); } // Signal that all bytes have been received. receiveDone.Set(); } } catch (Exception e) { Console.WriteLine(e.ToString()); } } privatestaticvoid Send(Socket client, String data) { // Convert the string data to byte data using ASCII encoding. byte[] byteData = Encoding.ASCII.GetBytes(data); // Begin sending the data to the remote device. client.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), client); } privatestaticvoid SendCallback(IAsyncResult ar) { try { // Retrieve the socket from the state object. Socket client = (Socket) ar.AsyncState; // Complete sending the data to the remote device. int bytesSent = client.EndSend(ar); Console.WriteLine("Sent {0} bytes to server.", bytesSent); // Signal that all bytes have been sent. sendDone.Set(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } staticvoid Main(string[] args) { StartClient(); Console.ReadLine(); } } }