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

转载于:https://www.cnblogs.com/zwq194/archive/2012/12/14/2817672.html

c#异步socket相关推荐

  1. 高并发 python socket send 异步_在Python中使用异步Socket编程性能测试

    ok,首先写一个python socket的server段,对开放三个端口:10000,10001,10002.krondo的例子中是每个server绑定一个端口,测试的时候需要分别开3个shell, ...

  2. [python3.3]Python异步Socket编程【TCP】

    参考: http://www.cnblogs.com/snailrun/p/3805188.html 异步网络据说能极大的提高网络server的连接速度,所以打算写一个专题,来学习和了解异步网络.因为 ...

  3. C#.net同步异步SOCKET通讯和多线程总结(转)

    C#.net同步异步SOCKET通讯和多线程总结 来源:http://www.cnblogs.com/Silverlight_Team/archive/2009/03/13/1411136.html ...

  4. python模块介绍-asyncore 异步socket处理器

    2019独角兽企业重金招聘Python工程师标准>>> 该模块提供了异步socket服务客户端和服务器的基础架构. 只有两种方法让程序在单个处理器上的同时做超过一件的事情. 多线程编 ...

  5. Netty实现的一个异步Socket代码

    本人写的一个使用Netty实现的一个异步Socket代码 package test.core.nio;import com.google.common.util.concurrent.ThreadFa ...

  6. 可扩展多线程异步Socket服务器框架EMTASS 2.0

    本文原创版权归 CSDN hulihui 所有,转载请按照如下方式显示标明原创作者及出处,以示尊重!! 作者: hulihui 原文:http://blog.csdn.net/hulihui/arch ...

  7. MSDN上的异步socket 服务端例子

    MSDN上的异步socket 服务端例子 2006-11-22 17:12:01|  分类: 代码学习 |  标签: |字号大中小 订阅 Imports System Imports System.N ...

  8. 同步Socket 与 异步 Socket

    同步Socket 与 异步 Socket: 1.同步就是阻塞的,比如 接受数据 如果没有回应 就一直等待. 2.异步就是不用等待: 同步Socket using System; using Syste ...

  9. Unity3D 异步Socket 网络编程

    简单的异步socket示例 简单过一下主要使用到的相关API: public class Socket : IDisposable { public Socket(AddressFamily addr ...

最新文章

  1. WinXP下At,Schtask和Eventtriggers命令实例(一)
  2. 第十五届全国大学生智能汽车竞赛创意组比赛进入全国总决赛队伍名单
  3. (周日赛)Sort the Array
  4. 如何在xp中添加打印机
  5. 发布一个jquery插件--在Web下输入密码时提示大写锁定键(2012-05-03 10:20最后修改)...
  6. 计算机老师的专业发展怎么写,高职计算机教师专业发展研究
  7. python字符串截取后拼接_Python字符串拼接、截断、搜索、替换,python,截取,查找
  8. IBM Bluemix 自然语言处理初识
  9. Docker和K8S对比
  10. 58VIP账号发贴器
  11. CnOpenData中国高新技术企业专利统计数据
  12. c语言定义浮点变量i和j,2012年计算机等级考试二级C语言基础教程:数据类型、变量和运算符...
  13. php web访问数据库,百宝箱之介绍PHP Web查询数据库基本步骤
  14. 安卓逆向-new-sec6-4 Java反射相关知识以及平头哥框架hook构造函数 | App发布测试版本感染
  15. linux 虚拟ip 作用,linux-高可用之虚拟ip地址(VIP)
  16. Corg.quartz.JobPersistenceException: Couldn‘t retrieve trigger
  17. SpringBoot集成Redis代码详解,收藏起来
  18. 关于获取安卓APP素材的方法
  19. ArcGIS中根据DEM提取等高线和高程点(附练习数据)
  20. GIS开发之二维地下管线综合管理系统(Arcgis)第二节 技术架构

热门文章

  1. 有关(int)和(int)的区别
  2. 程序调试的时候利用Call Stack窗口查看函数调用信息
  3. 虚拟机下Linux安装图解之一:VMware Workstation的安装
  4. 多维矩阵/数组变成一维数组
  5. pycharm用爱发电
  6. Hive表与hdfs文件关联
  7. 深入理解SpringCloud之配置刷新
  8. 《Adobe Photoshop CC经典教程》—第1课1.2节使用工具
  9. 基于SpringBoot的乡村医生诊疗系统的设计与实现
  10. JAVA通过JDBC连接并操作MySQL数据库