李进伟ID:yagebu1983
3273次访问,排名2万外好友30人,关注者46
付出最大努力,追求最高成就,享受最佳生活,收获无悔人生。
yagebu1983的文章
原创 0 篇
翻译 0 篇
转载 20 篇
评论 24 篇
最近评论
文章分类
    收藏
      相册
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      转载 .NET Socket开发之异步Socket(转)收藏

      新一篇: C#.net同步异步SOCKET通讯和多线程总结2 | 旧一篇: [C#通信二]C#.net同步异步SOCKET通讯和多线程总结1(转)

      .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);
        然后创建一个线程来处理客户端连接请求:

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

          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是用的同步的,我个人认为在这里用同步的会比用异步好一些。因为这样代码简单而且没有性能上的损失。 

      发表于 @ 2008年03月04日 18:06:00|评论(loading...)|编辑

      新一篇: C#.net同步异步SOCKET通讯和多线程总结2 | 旧一篇: [C#通信二]C#.net同步异步SOCKET通讯和多线程总结1(转)

      评论:没有评论。

      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © yagebu1983