基于C#的socket编程的TCP异步的实现代码

2019-12-30 14:24:36刘景俊


void Connect(IAsyncResult iar)
{
 Socket client=(Socket)iar.AsyncState;
 try
 {
  client.EndConnect(iar);
 }
 catch (Exception e)
 {
  Console.WriteLine(e.ToString());
 }
 finally
 {

 }
}

除了采用上述方法建立连接之后,也可以采用TcpListener类里面的方法进行连接建立。下面是服务器端对关于TcpListener类使用BeginAccetpTcpClient方法处理一个传入的连接尝试。以下是使用BeginAccetpTcpClient方法和EndAccetpTcpClient方法的代码:


public static void DoBeginAccept(TcpListener listner)
{
 //开始从客户端监听连接
 Console.WriteLine("Waitting for a connection");
 //接收连接
 //开始准备接入新的连接,一旦有新连接尝试则调用回调函数DoAcceptTcpCliet
 listner.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpCliet), listner);
}

//处理客户端的连接
public static void DoAcceptTcpCliet(IAsyncResult iar)
{
 //还原原始的TcpListner对象
 TcpListener listener = (TcpListener)iar.AsyncState;

 //完成连接的动作,并返回新的TcpClient
 TcpClient client = listener.EndAcceptTcpClient(iar);
 Console.WriteLine("连接成功");
}

代码的处理逻辑为:

(1)调用BeginAccetpTcpClient方法开开始连接新的连接,当连接视图发生时,回调函数被调用以完成连接操作;

(2)上面DoAcceptTcpCliet方法通过AsyncState属性获得由BeginAcceptTcpClient传入的listner实例;

(3)在得到listener对象后,用它调用EndAcceptTcpClient方法,该方法返回新的包含客户端信息的TcpClient。

BeginConnect方法和EndConnect方法可用于客户端尝试建立与服务端的连接,这里和第一种方法并无区别。下面看实例:


public void doBeginConnect(IAsyncResult iar)
{
 Socket client=(Socket)iar.AsyncState;
 //开始与远程主机进行连接
 client.BeginConnect(serverIP[0],13000,requestCallBack,client);
 Console.WriteLine("开始与服务器进行连接");
}
private void requestCallBack(IAsyncResult iar)
{
 try
 {
  //还原原始的TcpClient对象
  TcpClient client=(TcpClient)iar.AsyncState;
  //
  client.EndConnect(iar);
  Console.WriteLine("与服务器{0}连接成功",client.Client.RemoteEndPoint);
 }
 catch(Exception e)
 {
  Console.WriteLine(e.ToString());
 }
 finally
 {

 }
}

以上是建立连接的两种方法。可根据需要选择使用。 

3.2 发送与接受数据

在建立了套接字的连接后,就可以服务器端和客户端之间进行数据通信了。异步套接字用BeginSend和EndSend方法来负责数据的发送。注意在调用BeginSend方法前要确保双方都已经建立连接,否则会出异常。下面演示代码:


private static void 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);
}
private static void SendCallback(IAsyncResult ar)
{
 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);
  handler.Shutdown(SocketShutdown.Both);
  handler.Close();
 }
 catch (Exception e)
 {
  Console.WriteLine(e.ToString());
 }
}