SocketAsyncEventArgs是.net提供的关于异步socket类,封装了IOCP的使用,可以用它方便的实现NIO(non-blocking IO)

NIO对于提升某些场景下Server性能和吞吐量有很大益处,准备在服务框架中使用它来编写简易rpc的部分

微软官方的demo代理有所缺少:

http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

还有篇老外写的补充了缺少的代码:

http://www.codeproject.com/KB/IP/socketasynceventargssampl.aspx

不过例子还是感觉复杂了点,我只是需要知道SocketAsyncEventArgs本身如何使用而已,于是自行简化了一下:

   1:  using System;
   2:  using System.Net;
   3:  using System.Net.Sockets;
   4:  using System.Text;
   5:   
   6:  namespace SocketAsyncServer
   7:  {
   8:      public static class Program
   9:      {
  10:          public static void Main(String[] args)
  11:          {
  12:              IPAddress[] addressList = Dns.GetHostEntry(Environment.MachineName).AddressList;
  13:              new TcpListener().Listen(new IPEndPoint(addressList[addressList.Length - 1], 9900));
  14:   
  15:              Console.ReadKey();
  16:          }
  17:      }
  18:   
  19:      public class TcpListener
  20:      {
  21:          private SocketAsyncEventArgs Args;
  22:          private Socket ListenerSocket;
  23:          private StringBuilder buffers;
  24:          public TcpListener() { }
  25:          public void Listen(EndPoint e)
  26:          {
  27:              //buffer
  28:              buffers = new StringBuilder();
  29:              //socket
  30:              ListenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  31:              ListenerSocket.Bind(e);
  32:              ListenerSocket.Listen(10);
  33:              //异步socket事件
  34:              Args = new SocketAsyncEventArgs();
  35:              Args.Completed += new EventHandler<SocketAsyncEventArgs>(ProcessAccept);
  36:              BeginAccept(Args);
  37:              Console.WriteLine("server run at {0}", e.ToString());
  38:          }
  39:   
  40:          //开始接受
  41:          void BeginAccept(SocketAsyncEventArgs e)
  42:          {
  43:              e.AcceptSocket = null;
  44:              if (!ListenerSocket.AcceptAsync(e))
  45:                  ProcessAccept(ListenerSocket, e);
  46:          }
  47:          //接受完毕 开始接收和发送
  48:          void ProcessAccept(object sender, SocketAsyncEventArgs e)
  49:          {
  50:              Socket s = e.AcceptSocket;
  51:              e.AcceptSocket = null;
  52:   
  53:              int bufferSize = 10;//1000 * 1024;
  54:              var args = new SocketAsyncEventArgs();
  55:              args.Completed += new EventHandler<SocketAsyncEventArgs>(OnIOCompleted);
  56:              args.SetBuffer(new byte[bufferSize], 0, bufferSize);
  57:              args.AcceptSocket = s;
  58:              if (!s.ReceiveAsync(args))
  59:                  this.ProcessReceive(args);
  60:   
  61:              BeginAccept(e);
  62:          }
  63:   
  64:          //IOCP回调
  65:          void OnIOCompleted(object sender, SocketAsyncEventArgs e)
  66:          {
  67:              switch (e.LastOperation)
  68:              {
  69:                  case SocketAsyncOperation.Receive:
  70:                      this.ProcessReceive(e);
  71:                      break;
  72:                  case SocketAsyncOperation.Send:
  73:                      this.ProcessSend(e);
  74:                      break;
  75:                  default:
  76:                      throw new ArgumentException("The last operation completed on the socket was not a receive or send");
  77:              }
  78:          }
  79:          
  80:          //接收完毕
  81:          void ProcessReceive(SocketAsyncEventArgs e)
  82:          {
  83:              if (e.BytesTransferred > 0)
  84:              {
  85:                  if (e.SocketError == SocketError.Success)
  86:                  {
  87:                      //读取
  88:                      var data=Encoding.ASCII.GetString(e.Buffer, e.Offset, e.BytesTransferred);
  89:                      buffers.Append(data);
  90:                      Console.WriteLine("Received:{0}", data);
  91:   
  92:                      if (e.AcceptSocket.Available == 0)
  93:                      {
  94:                          //读取完毕
  95:                          Console.WriteLine("Receive Complete.Data:{0}", buffers.ToString());
  96:                          //重置
  97:                          buffers = new StringBuilder();
  98:                          //发送反馈
  99:                          Byte[] sendBuffer = Encoding.ASCII.GetBytes("result from server");
 100:                          e.SetBuffer(sendBuffer, 0, sendBuffer.Length);
 101:                          if (!e.AcceptSocket.SendAsync(e))
 102:                          {
 103:                     
 104:                              this.ProcessSend(e);
 105:                          }
 106:                      }
 107:                      else if (!e.AcceptSocket.ReceiveAsync(e))
 108:                      {
 109:                          this.ProcessReceive(e);
 110:                      }
 111:                  }
 112:                  else
 113:                  {
 114:                      //this.ProcessError(e);
 115:                  }
 116:              }
 117:              else
 118:              {
 119:                  //this.CloseClientSocket(e);
 120:              }
 121:          }
 122:          //发送完毕
 123:          void ProcessSend(SocketAsyncEventArgs e)
 124:          {
 125:              if (e.SocketError == SocketError.Success)
 126:              {
 127:   
 128:                  if (!e.AcceptSocket.ReceiveAsync(e))
 129:                  {
 130:                      this.ProcessReceive(e);
 131:                  }
 132:              }
 133:              else
 134:              {
 135:   
 136:              }
 137:          }
 138:      }
 139:       
 140:  }

SocketAsyncEventArgs相关推荐

  1. [转|整理]翻译:使用.net3.5的缓存池和SocketAsyncEventArgs类创建socket服务器

    原文地址:http://www.cnblogs.com/onlytiancai/archive/2008/06/25/1229321.html http://www.cnblogs.com/killk ...

  2. Socket异步通信——使用SocketAsyncEventArgs

    上一次的博文说错了东西,幸好有园友指出.才把错误改正过来,顺便也把利用SocketAsyncEventArgs进行Socket异步通信这方面的知识整理一下. 之前看了网上的代码,每进行一次异步操作都n ...

  3. C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型

    原文:C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型 线程模型 SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO ...

  4. 译文:如何使用SocketAsyncEventArgs类(How to use the SocketAsyncEventArgs class)

    转载自: http://blog.csdn.net/hulihui/article/details/3244520 原文:How to use the SocketAsyncEventArgs cla ...

  5. C#实现异步阻塞TCP(SocketAsyncEventArgs,SendAsync,ReceiveAsync,AcceptAsync,ConnectAsync)...

    1.类 (1)socket IO操作内存管理类 BufferManager // This class creates a single large buffer which can be divid ...

  6. C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

    原创性申明 本文作者:小竹zz  博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处 引言 我一直在探寻一个高性 ...

  7. 【Socket研究】~。~ Scoket开发蛋疼笔记 Silverlight

    客户端连接步骤[Silverlight] [注意] Silverlight 客户端 记得一定是异步连接. 一.连接步骤 1.实例一个Scoket 2.实例套接字 SocketAsyncEventArg ...

  8. C# 高性能 TCP 服务的多种实现方式

    哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C# 编写 TCP 服务的花样姿势!>. 本篇文 ...

  9. .NET3.5中的高性能 Socket API

    在 .NET Framework 2.0 版本中,System.Net.Sockets 命名空间提供了一个几乎拥有 Windows® WinSock Win32® API 的所有功能的 Socket ...

最新文章

  1. Modelsim仿真查看内部信号
  2. 八篇 NeurIPS 2019 最新图神经网络相关论文
  3. gitee最多上传多大文件_H5移动端图片压缩上传,基于Jquery的前端,实现拍照上传,选择相册
  4. Spring–添加AOP支持
  5. java指令和javac指令总结
  6. 机器学习笔记(六)——朴素贝叶斯法的参数估计
  7. 自注意力机制卷积神经网络的作物叶片病害识别
  8. 2019年7月28日解决战网BLZBNTBNA00000005BLZBNTBNA00000006BLZBNTBTS0000005DBLZBNTBTS0000004A 007D0 008A4 00840
  9. win10打开internet信息服务器,Win10打开internet信息服务的方法
  10. C# 导入.reg文件
  11. MES管理系统基础知识
  12. 【SAMMY】DOS下操作隐藏文件、文件夹
  13. java 时区 夏令时_如何使用Java中的TimeZone解决夏令时问题
  14. 3.飞机机票的价格受季节旺季、淡季的影响,头等舱与经济舱的价格也不同机票的原价为5000,4~10月为旺季, 旺季:头等舱打9折,经济舱打8折;淡季:头等舱打5折,经济舱打4折。请编写根据出行的月份和
  15. 通过AWS云平台 构建云上勒索病毒防护体系,轻松保护数据完整性
  16. shell下删除文件末尾的空行
  17. 从零开始构建嵌入式实时操作系统5——设计延时功能
  18. matlab 折线图 标记_MATLAB画图使用不同的线型、点及标记
  19. photoshop第五章:图像的调整
  20. SM中两种组件的区别----来自阿红

热门文章

  1. 信息学奥赛一本通 1144:单词翻转 | OpenJudge NOI 1.7 27
  2. 24 WM配置-策略-入库策略4-定义空存储箱策略L(Next Empty Bin Strategy)
  3. 为什么做了梦第二天想不起来_转告父母!为什么有人睡觉爱把脚伸到被子外面?其实与身体状况有关…切勿忽视...
  4. 计算机两年发展,计算机发展历史
  5. 以独占方式锁定此配置文件失败.另一个正在运行_加速用例执行最有效的方法,手把手教你如何并行地运行自动化测试...
  6. python random库下载_Python---random库(随机数)
  7. Kafka刚开启就秒退
  8. python开发效率高吗_从运行效率与开发效率比较Python和C++
  9. 非插件实现回复可见效果
  10. 旋转炫酷相册-快制作你喜欢源码