首页 > 其他分享 >.NET Socket开发之异步Socket

.NET Socket开发之异步Socket

时间:2022-12-02 22:00:41浏览次数:40  
标签:info 异步 Socket ar catch NET 函数


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

标签:info,异步,Socket,ar,catch,NET,函数
From: https://blog.51cto.com/u_11295556/5907623

相关文章

  • 搞定Dart的异步
    一.Dart的异步模型我们先来搞清楚Dart是如何搞定异步操作的1.1.Dart是单线程的1.1.1.程序中的耗时操作开发中的耗时操作:在开发中,我们经常会遇到一些耗时的操作......
  • 使用.NET7和C#11打造最快的序列化程序-以MemoryPack为例
    使用.NET7和C#11打造最快的序列化程序-以MemoryPack为例 译者注本文是一篇不可多得的好文,MemoryPack的作者neuecc大佬通过本文解释了他是如何将序列化程序性能提......
  • ASP.NET中如何调用存储过程
     用ASP.NET与SQLSERVER可是缘份最好了,稍大的程序一般第一先考虑的是SQLSERVER,只是一些很考虑经济的才使用ACCESS等了。用SQLSERVER,为了使数据库的效率更好,一般都会才取......
  • webSocket基本使用
    //创建ws实例,建立连接(ws://121.40.165.18.8800有广告)    varws=newWebSocket('wss://javascript.info/article/websocket/demo/hello')    //......
  • ConfigMap/Secret:怎样配置、定制应用(chrono《kubernetes入门实战课》笔记整理)
     【概念说明】Kubernetes里专门用来管理配置信息的两种对象:ConfigMap和Secret,使用它们来灵活地配置、定制我们的应用。配置根据数据安全划分,分为两种:明文配置:不加密......
  • ASP.NET Web API的Controller是如何被创建的?
    WebAPI调用请求的目标是定义在某个HttpController类型中的某个Action方法,所以消息处理管道最终需要激活目标HttpController对象。调用请求的URI会携带目标HttpController的......
  • 第1部分 使用C#和.NET (Code like pro in C#)
    在本书的第一部分,我们将简要介绍C#语言,并讨论它的一些特性。第1章介绍了什么是C#和.NET,以及为什么您会(也不会)在项目中使用它们。第2章深入探讨了.NET的各种迭代,并在编译过......
  • .NET 6使用ImageSharp给图片添加水印
    .NET6使用ImageSharp给图片添加水印​.NET6中,使用System.Drawing操作图片,生成解决方案或打包的时候,会有警告,意思是System.Drawing仅在'windows'上受支持。微软官......
  • 记一次 .NET 某电子厂OA系统 非托管内存泄露分析
    一:背景1.讲故事这周有个朋友找到我,说他的程序出现了内存缓慢增长,没有回头的趋势,让我帮忙看下到底怎么回事,据朋友说这个问题已经困扰他快一周了,还是没能找到最终的问题,看......
  • vue多个方法的异步请求
    1、async和awaitasync/await是一种建立在Promise之上的编写异步或非阻塞代码的新方法。async是异步的意思,而await是asyncwait的简写,即异步等待。1//假设这是......