.NET Socket开发中的异步Socket

来源:网络整理 责任编辑:栏目编辑 发表时间:2013-07-02 03:05 点击:
在基于.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);
  &nbs
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 用C#制作屏幕捕获程序
    • .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上
    • 遍历ArrayList易犯错误
    • C#对XML操作:一个处理XML文件的类(1)
    • .NET简谈反射(动态调用)
    • 使用C#编写LED样式时钟控件
    • DataList嵌套问题 如何删除内层子DataList的记录
    • 怎样用C#实现完整文档打印功能
    • .NET简谈自定义事务资源管理器
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1