.NET Socket开发之异步Socket

在基于.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做为回调函数
            }

        }
  我们再来看看回调函数的定义:

        private void ReceiveCallBack(IAsyncResult ar)
        
{
            UserInfo info 
= (UserInfo)ar.AsyncState;
            Socket handler 
= info.socket;
            
int readCount = 0;
            
try
            
{
                readCount 
= handler.EndReceive(ar);//调用这个函数来结束本次接收并返回接收到的数据长度。
            }

            
catch (SocketException)//出现Socket异常就关闭连接
            {
                CloseSocket(info);
//这个函数用来关闭客户端连接
                return;
            }

            
catch
            
{
            }

            
if (readCount > 0)
            
{
                
byte[] buffer = new byte[readCount];
                Buffer.BlockCopy(info.Buffer, 
0, buffer, 0, readCount);
                Analyzer(info, buffer);
//这个函数用来处理接收到的信息。
                try
                
{
                    handler.BeginReceive(info.Buffer, 
0, info.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), info);//向系统投递下一个接收请求
                }

                
catch (SocketException) //出现Socket异常就关闭连接
                {
                    CloseSocket(info);
                }

                
catch
                
{
                }

            }

            
else //如果接收到0字节的数据说明客户端关闭了Socket,那我们也要关闭Socket
            {
                CloseSocket(info);
            }

        }

接下来我们看看如何发送数据给客户端:


        public void Send(Socket socket, byte message)
        
{
            
try
            
{
                info.socket.BeginSend(message, 
0, _byte.Length, SocketFlags.None, new AsyncCallback(SendCallBack), info);//这里向系统投递一个发送数据的请求,并指定一个回调函数。
            }

            
catch (SocketException ex)
            
{
                CloseSocket(info);
            }

            
catch
            
{
            }

        }

定义发送回调函数:


        private void SendCallBack(IAsyncResult ar)
        
{
            UserInfo info 
= (UserInfo)ar.AsyncState;
            
try
            
{
                info.socket.EndSend(ar);
//调用这个函数来结束本次发送。
            }

            
catch
            
{
            }

        }

 

好了,整个监听、接收、发送的过程就完成了,很简单吧。现在需要说明的是,我在这里接收客户端连接的Accept是用的同步的,我个人认为在这里用同步的会比用异步好一些。因为这样代码简单而且没有性能上的损失。

今天我就写到这里了!下次我们再继续。

 
转自 http://www.cnblogs.com/wzd24/archive/2007/06/15/782833.html
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: .NET Socket异步客户端辅助类是一种用于简化异步网络编程的工具,它可以帮助开发者更轻松地创建和管理客户端与服务器之间的通信。下面是一些关于.NET Socket异步客户端辅助类的重要信息。 首先,.NET Socket异步客户端辅助类提供了一种方便的方法来实现异步通信,使开发者能够在不阻塞主线程的情况下进行网络通信。通过使用异步操作,可以提高应用程序的性能和响应能力。 其次,这个辅助类提供了一系列方法和事件,用于与服务器进行连接、发送和接收数据。例如,它提供了一个ConnectAsync方法,可以异步连接服务器。它还提供了一个SendAsync方法,可以异步发送数据到服务器。另外,它还提供了一个ReceiveAsync方法,可以异步接收来自服务器的数据。 除了发送和接收数据,该辅助类还提供了一些其他功能。例如,它提供了一个用于断开与服务器的连接的DisconnectAsync方法。它还提供了一个用于设置和获取服务器的IP地址和端口的属性。 最后,这个辅助类还具有一些事件,用于处理与服务器之间的异步操作。例如,它提供了一个用于处理连接成功的事件,一个用于处理接收到数据的事件,以及一个用于处理发生错误的事件。通过使用这些事件,开发者可以编写处理不同情况下的网络通信的代码逻辑。 总而言之,.NET Socket异步客户端辅助类是.NET框架中提供的一个工具,用于简化异步网络编程。通过它,开发者可以更方便地创建和管理客户端与服务器之间的通信,从而提高应用程序的性能和响应能力。 ### 回答2: .NET Socket 异步客户端辅助类可以帮助开发人员更便捷地创建异步网络客户端应用程序。该辅助类是基于.NET Socket 类库的,通过使用异步方法和事件处理器,提供了更高效和可靠的网络通信功能。 首先,通过该辅助类,我们可以方便地创建与服务器端的连接。它提供了异步连接方法,可以在不阻塞主线程的情况下与服务器建立连接。这样可以允许应用程序同时处理其他任务,提高程序的并发性和性能。 其次,辅助类还具备异步发送和接收数据的功能。通过异步发送方法,我们可以将数据发送到服务器,并在发送完成时得到相应的通知。而异步接收方法则可以让我们在后台处理接收到的数据,而不会阻塞程序的其他操作。这使得我们能够实现同时发送和接收数据的功能,提高了应用程序的响应速度。 此外,该辅助类还提供了事件处理器,用于处理连接、发送和接收等过程中发生的异步事件。例如,我们可以注册连接成功时的事件处理器,以便在连接建立完成后做进一步的处理。同样,我们还可以处理接收到数据的事件,根据实际业务需求进行相应的处理。 总而言之,.NET Socket 异步客户端辅助类为开发人员提供了一种方便、高效和可靠的方式来构建异步网络客户端应用程序。通过它,我们可以简化开发过程,提高程序的性能和可维护性,实现更好的用户体验。 ### 回答3: .NET Socket异步客户端辅助类是在使用.NET框架进行网络编程时提供的一种工具,用于创建和管理异步客户端网络连接。这些辅助类提供了简化操作的方法和事件,使开发人员能够更方便地在应用程序中实现异步通信。 首先,它包括一个异步客户端类,该类提供了用于与服务器建立连接、发送和接收数据的方法。它包装了系统级的Socket类,并且通过使用异步方法,可以避免阻塞应用程序线程。 其次,异步客户端辅助类还提供了一些事件,用于处理网络连接过程中的各种情况。例如,它提供了一个连接已建立的事件,可以在连接成功时触发,以便应用程序可以执行特定的操作。同样,它还提供了接收到数据的事件,可以在收到来自服务器的数据时触发,使我们能够对数据进行处理。 此外,辅助类还提供了一些属性和方法,用于配置和管理异步操作。例如,我们可以设置接收缓冲区的大小,以便更高效地处理大量数据。还可以指定连接超时时间,以防止长时间无法建立连接。 总之,.NET Socket异步客户端辅助类是.NET框架提供的一种简化网络编程的工具。它通过封装底层的Socket类,提供了一组易于使用的方法和事件,使开发人员能够更轻松地实现异步通信。使用这些辅助类,我们可以更加高效和可靠地处理网络连接,为我们的应用程序带来更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值