上一章主要展示了Socket的Tcp\Udp两种协议下的基本通讯方式,属于同步通讯。至于一个服务器对应多个客户端,或者对应多个请求,我们采用的是多线程的方式来解决此问题。然而本章节我们将有更好的方式去实现它:Socket在Tcp\Udp两种协议下的异步通讯方式。
基于Tcp协议异步:
BeginAccept方法和EndAccept方法
包含在System.Net.Sockets命名空间下。异步Tcp使用BeginAccept方法开始接受新的客户端连接请求,该方法中系统自动利用线程池创建需要的线程,并在操作完成时利用异步回调机制调用提供给它的方法,同时返回相应的状态参数,然后方可利用EndAccept方法结束该连接请求.
BeginRecive方法和EndRecive方法
异步Tcp使用BeginRecive方法和开始接受客户端发送的的消息,该方法如上同理,接受完毕后调用回调函数传递相应的状态参数。利用EndRecive方法接受接受消息。
至于BeginSend方法和EndSend方法、BeginConnect方法和EndConnect方法与上类似。
下面我们来看看如何在Tcp协议下进行客户端与服务器端之间的通讯:
1、服务端
using System;
using System.Collections.Generic;
using System.Text;
#region 命名空间
using System.Net;
using System.Net.Sockets;
using System.Threading;
#endregion
namespace AsynServerConsole
{
/// <summary>
/// Tcp协议异步通讯类(服务器端)
/// </summary>
public class AsynTcpServer
{
#region Tcp协议异步监听
/// <summary>
/// Tcp协议异步监听
/// </summary>
public void StartListening()
{
//主机IP
IPEndPoint serverIp = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8686);
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
tcpServer.Bind(serverIp);
tcpServer.Listen(100);
Console.WriteLine("异步开启监听...");
AsynAccept(tcpServer);
}
#endregion
#region 异步连接客户端
/// <summary>
/// 异步连接客户端
/// </summary>
/// <param name="tcpServer"></param>
public void AsynAccept(Socket tcpServer)
{
tcpServer.BeginAccept(asyncResult =>
{
Socket tcpClient = tcpServer.EndAccept(asyncResult);
Console.WriteLine("server<--<--{0}", tcpClient.RemoteEndPoint.ToString());
AsynSend(tcpClient, "收到连接...");//发送消息
AsynAccept(tcpServer);
AsynRecive(tcpClient);
}, null);
}
#endregion
#region 异步接受客户端消息
/// <summary>
/// 异步接受客户端消息
/// </summary>
/// <param name="tcpClient"></param>
public void AsynRecive(Socket tcpClient)
{
byte[] data = new byte[1024];
try
{
tcpClient.BeginReceive(data, 0, data.Length, SocketFlags.None,
asyncResult =>
{
int length = tcpClient.EndReceive(asyncResult);
Console.WriteLine("server<--<--client:{0}", Encoding.UTF8.GetString(data));
AsynSend(tcpClient, "收到消息...");
AsynRecive(tcpClient);
}, null);
}
catch (Exception ex)
{
Console.WriteLine("异常信息:", ex.Message