首页 / 软件开发 / .NET编程技术 / .NET Socket开发之异步Socket
.NET Socket开发之异步Socket2010-12-02 cnblogs wzd24 牧野在基于.NET的网络服务端的中,我们用到和听到的最多的恐怕就是异步 Socket了。异步Socket的性能比同步高出很多,但是编写代码比较复杂。因此异 步Socket也是网络上讨论比较多的话题。今天,我们就来讨论一下如何 用异步Socket开发网络应用。在此之前我们先讨论两个问题。一、异步 Socket是如何工作的:那异步Socket是如何工作的呢?我以接收一条消 息来说明这个问题。首先,程序向系统投递一个接收数据的请求,并为其指定一 个数据缓冲区和回调函数,回调函数用来指示当数据到达后将如何处理,然后我 们的程序继续执行下去,当有数据到达的时候,系统将数据读入缓冲区,并执行 回调函数,处理这条消息。我们并不需要关心这条消息何时到达。二、 什么情况下我们用异步Socket:有些人认为,异步Socket的性能比同步 Socket的性能高很多,应该在各种环境下都用异步Socket,其实不然。在某些环 境下面。异步反到比同步的性能低,那么在哪些情况下会这样呢?1、 客户端Socket。2、服务端连接数比较少。3、连接数很多,但 都是短连接。在这些环境下,我们用同步Socket不但可以简化代码,而 且性能并不会比异步Socket低。但在服务端连接比较多而且是长连接的情况下, 我们就要使用异步Socket。现在我们来看看如何用异步Socket编程。首先,我们要建立一个Socket用来监听:Socket _listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint localEP = new IPEndPoint(_address, _port);
_listener.Bind(localEP);
_listener.Listen (100);
然后创建一个线程来处理客户端连接请求:Thread _acceptWorkThread = new Thread (AcceptWorkThread);
_acceptWorkThread.Start();
private void AcceptWorkThread()
{
while (_isListener)
{
UserInfo info = new UserInfo();//这个UserInfo是用来保存客户信息的。
info.socket = socket;
Socket socket = _listener.Accept ();
//这里进行其它处理。
socket.BeginReceive(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, ReceiveCallBack, info);//这里向 系统投递一个接收信息的请求,并为其指定ReceiveCallBack做为回调函数
}
}