.NET Socket服务编程之-高效连接接入编

C#网络编程系列文章(五)之Socket实现异步UDP服务器 原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 本文介绍 在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。System.Net 命名空间中的所有其他网 阅读详情

 在.NET上编写网络服务深入都有2,3年了,而这些时间时如何在.NET里实现网络服务积累了一些经验.在接下来的时间里会把这方面的经验通过博客的方式分享出来.而这一章主要是讲解在如果提高服务连接接入的效率,从而让服务连接接入的并发量有高吞吐的性能.

       其实.NET提供了一个非常强大的网络模型给我们使用,而我们只需要把这个模型用好那基于是不存在多大问题.不过由于很多开发人员对这方面并没有了解和深入所以感觉.Net编写一个高效能的服务比较因难.下面通过不同的示例来描述问题的所在从而避免这些问题的出现,让编写的服务更高效.

示例1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
try  {
           listener.Bind(localEndPoint);
           listener.Listen(10);
 
           // Start listening for connections.
           while  ( true ) {
               Console.WriteLine( "Waiting for a connection..." );
               // Program is suspended while waiting for an incoming connection.
               Socket handler = listener.Accept();
               data = null ;
 
               // An incoming connection needs to be processed.
               while  ( true ) {
                   bytes = new  byte [1024];
                   int  bytesRec = handler.Receive(bytes);
                   data += Encoding.ASCII.GetString(bytes,0,bytesRec);
                   if  (data.IndexOf( "<EOF>" ) > -1) {
                       break ;
                   }
               }
 
               // Show the data on the console.
               Console.WriteLine( "Text received : {0}" , data);
 
               // Echo the data back to the client.
               byte [] msg = Encoding.ASCII.GetBytes(data);
 
               handler.Send(msg);
               handler.Shutdown(SocketShutdown.Both);
               handler.Close();
           }
           
       } catch  (Exception e) {
           Console.WriteLine(e.ToString());
       }

     这是从MSDN得到的一个服务端示例的代码地址来源http://msdn.microsoft.com/en-us/library/6y0e13d3(v=vs.110).aspx以上代码说实话真没多大的参考意义,不过作为一个演示如何构建一个服务监听那还是起到作用;用在服务器应用上是完全不可行,因为这只会导致会话串行,同时只能处理一个.接下来在网上找一个支持连接并发的示例看一下

示例2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
namespace  SocketServer
{
     class  Program
     {
         private  static  byte [] result = new  byte [1024];
         private  static  int  myProt = 8885;   //端口
         static  Socket serverSocket;
         static  void  Main( string [] args)
         {
             //服务器IP地址
             IPAddress ip = IPAddress.Parse( "127.0.0.1" );
             serverSocket = new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             serverSocket.Bind( new  IPEndPoint(ip, myProt));  //绑定IP地址:端口
             serverSocket.Listen(10);    //设定最多10个排队连接请求
             Console.WriteLine( "启动监听{0}成功" , serverSocket.LocalEndPoint.ToString());
             //通过Clientsoket发送数据
             Thread myThread = new  Thread(ListenClientConnect);
             myThread.Start();
             Console.ReadLine();
         }
 
         /// <summary>
         /// 监听客户端连接
         /// </summary>
         private  static  void  ListenClientConnect()
         {
             while  ( true )
             {
                 Socket clientSocket = serverSocket.Accept();
                 clientSocket.Send(Encoding.ASCII.GetBytes( "Server Say Hello" ));
                 Thread receiveThread = new  Thread(ReceiveMessage);
                 receiveThread.Start(clientSocket);
             }
         }
 
         /// <summary>
         /// 接收消息
         /// </summary>
         /// <param name="clientSocket"></param>
         private  static  void  ReceiveMessage( object  clientSocket)
         {
             Socket myClientSocket = (Socket)clientSocket;
             while  ( true )
             {
                ...
                     int  receiveNumber = myClientSocket.Receive(result);
                     Console.WriteLine( "接收客户端{0}消息{1}" , myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));
             }
         }
     }
}

         以上示例可以接受多个连接同时进行处理,但缺点是非常明显如果服务支撑的连接数比较大的情况那这种方式是不可行.你想象一下如果这个服务端要支撑1W,3W或者10W连接的情况那需要开多少个线程去处理这些连接呢,即使可以这样做那线程的开销也足够让服务器受的了.接下来看MSDN提供的异步示例

示例3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
while  ( true )
       {        // Set the event to nonsignaled state.
                 allDone.Reset();
 
                 // Start an asynchronous socket to listen for connections.
                 Console.WriteLine( "Waiting for a connection..." );
                 listener.BeginAccept(
                     new  AsyncCallback(AcceptCallback),
                     listener );
 
                 // Wait until a connection is made before continuing.
                 allDone.WaitOne();
             }
   public  static  void  AcceptCallback(IAsyncResult ar) {
         // Signal the main thread to continue.
         allDone.Set();
 
         // Get the socket that handles the client request.
         Socket listener = (Socket) ar.AsyncState;
         Socket handler = listener.EndAccept(ar);
 
         // Create the state object.
         StateObject state = new  StateObject();
         state.workSocket = handler;
         handler.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
             new  AsyncCallback(ReadCallback), state);
     }

     这个示例来源于http://msdn.microsoft.com/en-us/library/6y0e13d3(v=vs.110).aspx,其实这个代码已经非常高效的体现我们在编写服务的时候如何实现一个接入监听.此示例用在应用开发上完全胜任的.

改进

        以上示例3已经提供非常不错的代码,那是否可以进行一些规范的改进呢.其实在过往的经验中来看是可以,首先我们了解.NET有两种线程,一种是我们常用的而别一种则是IO线程.其实用一些测试工具可以看到AcceptCallback是由IO线程回调,那我们希望回调线程更快速度的释放出来,那我们需要做一些隔离上的规划.其实在很多范例代码中都是一连串地把事件做完,接入->接收->发送.这样一个连贯性的代码实现导致后其线程资源的控制和规划就变得非常因难.   

 

从代码设计可以通过队列把回调线程需要的工作隔离出来,可以让回调线程更快的归队来处理其接接入的工作.当隔离后即使以后连接接入需要加一些逻辑控制也不会影响回调线程的快速回归.这样就可以让整个异步线程资源更高效.

1
2
3
4
5
6
7
8
9
public  static  void  AcceptCallback(IAsyncResult ar) {
        // Signal the main thread to continue.
        allDone.Set();
 
        // Get the socket that handles the client request.
        Socket listener = (Socket) ar.AsyncState;
        Socket handler = listener.EndAccept(ar);
        Queue.Enqueue(handler);
    }

总结

        其实队列分离和控制在整个网络通讯实施过程会经常用到,其主要作是处理资源的分块和线程资源控制.毕竟任何一台服务器的资源都是有限的,如何分配线程资源给不同的任何来完成工作是非常重要,毕竟大量线程的开销会对系统造成比较大的压力.

linux系统编程_socket网络编程 服务器需要先创建Socket对象并将其绑定到本地IP地址和端口号,然后监听客户端连接请求,并创建新的Socket对象进行数据传输。4. 接受连接请求:当客户端请求连接时,服务器应用程序通过accept()函数接受连接请求,并创建一个新的Socket对象来处理客户端的请求。1. 创建Socket对象:使用Socket库中提供的函数创建一个Socket对象,它代表着一个网络通信端点,包括IP地址和端口号。如果返回-1,表示接收失败。是一个通用的地址结构体,根据协议族的不同,需要将其转换为对应的具体结构体,如。 阅读详情

相关推荐

DotNettySocket:为什么它可能是最高效的跨平台.NET Socket框架?

DotNettySocket 是一个基于 .NET 的高性能、跨平台的 Socket 通信框架,它简化了网络编程的复杂度,让开发者能够更加专注于业务逻辑的实现。通过使用 DotNettySocket,你可以轻松地开发出支持异步IO操作的网络应用,无论是在 Windows、Linux 还是 MacOS 上。

java专栏 1400

.net网络编程之一:Socket编程

 在.net下进行网络编程其实也相对比较简单,因为在.net类库已经提供了大量封装好的类。在.net下网络编程比较底层的类是System.Net.Sockets.Socket类,这个类提供了丰富的方法和属性,并且还提供了异步数据传输支持。对Socket类做一个简单的介绍,它有如下常见方法:public Socket Accept ():为新建连接创建新的 Socket。    public voi

周公(周金桥)的专栏 2万+

C# Socket编程TCP通信示例详解

在现代网络通信中,Socket编程作为实现跨网络设备数据交互的核心技术,扮演着至关重要的角色。C#作为.NET平台下主流的开发语言,其通过System.Net.Sockets命名空间提供了强大的Socket类库,支持开发者构建高效、稳定的网络应用。本章将从Socket的基本概念入手,逐步解析其在C#中的应用方式,帮助读者建立对网络通信的初步认知。Socket本质上是一种通信端点,它允许应用程序通过网络协议(如TCP/IP)进行数据交换。

weixin_35755562的博客 942

(翻译).NET中高效能的socket编程(三)

下面是异步服务器端的代码。class AsynchronousIoServer { private Socket _serverSocket; private int _port; public AsynchronousIoServer(int port_num) { _port=port_num; } private class ...

weixin_30622181的博客 103

构建高效异步Socket服务端控制台应用

Socket编程是构建网络应用的基础,它允许应用在不同的主机之间传输数据。本章将介绍Socket编程的基本概念,服务端应用的构建以及如何处理客户端请求。在本章节中,我们探讨了.NET框架下的异步Socket编程模型的基本概念和特点,以及如何创建异步Socket服务端实例和详解其事件处理流程。通过async和await关键字的使用,我们能有效地管理异步操作,提高应用程序的性能和响应性。

weixin_36197669的博客 318

掌握SocketAsyncEventArgs:.NET高效网络编程

SocketAsyncEventArgs是.NET框架提供的一个类,它用于支持异步Socket操作。相比于传统的同步Socket编程,使用SocketAsyncEventArgs可以提高应用程序的响应性和性能,特别是在需要处理大量连接和数据传输的应用场景中。

weixin_42453228的博客 1352

Socket服务端接受多个客户端的连接(.NET)

本文模拟一个判断数据是否大于100的服务器端接受多个客户端的连接,为多个客户端提供服务的演示,例子比较简单,只为模拟一种场景,起到为入门读者踏入网络编程的指引 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Threading; using System.Net.Sockets; namespace Net.Dale.T

长安诗社社长@-梁瀚文- https://github.com/HevnChin https://gitee.com/HevnChin 2195

C# Socket网络编程项目实战(客户端与服务器通信)

本文还有配套的精品资源,点击获取 简介:Socket网络编程是构建分布式系统和实时通信应用的核心技术之一。C#通过.NET框架中的System.Net.Sockets命名空间,提供了强大的Socket支持,可用于开发高效、可靠的网络通信程序。本项目基于C#实现了一个完整的Socket通信系统,包含客户端和服务器端两个窗体,演示了数据交换、文件传输、分块传输机制及UI线程安全更新等核心功能。项目涵盖Socket的创建、绑定、监听、连接、数据收发、异常处理与资源释放全过程,是学习网络编程、多线程处理

weixin_30632267的博客 768

python socketserver连接数量限制_通过socket实现处理多个连接,send和resv都是有数量限制的...

我们现在先来实现,跟一个人来来回回不停的讲电话。客户端,通过循环来输入多次命令:client.recv(1024)每次只接收1K的内容服务端来改成多次接收:如果你写成如下的代码:那么造成的结果,就是很多人连上来,但是每次只能跟服务端说一句话,然后第二句话卡住。第二个客户端一样,每次只能跟服务端说一句话,然后第二句话卡住。也就是服务端写成这种代码是不行的,会造成代码卡住。我们现在先来实现跟一个人可以...

weixin_39569112的博客 889

手把手教你设计T型和Π型衰减器:从理论计算到实际搭建(含误差分析)

本文详细介绍了T型和Π型衰减器的设计方法,从理论计算到实际搭建,包括电阻值推导、元件选择技巧及误差分析。通过实例演示如何设计50Ω系统中的10dB衰减器,并提供了高频应用和优化策略,帮助电子工程师掌握阻抗匹配与信号衰减的核心技术。

weixin_33737774的博客 395

从0到1打造一台机器人走起来

1)本体机械结构设计,依据人体生物学和生物力学知识,结合机器人运动时各关节扭矩需求,进行合理选用电机,比如胯部需要大扭矩,腿部惯量小等2)硬件拓扑上,分层架构的信号层和功率协同工作,高带宽,低延时,硬实时3)步态规划设计与验证环节实机回溯和部署过程:Real2Sim,Sim2Sim,Sim2Real。

weixin_43163941的博客 244

Windows Phone下的Socket编程

讨论下有关于Windows Phone下的Socket编程方面的知识。 Socket就是通常所称的套接字,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过Socket向网络发出请求或者应答网络请求。 这里,初学者可能会分不清Socket连接与HTTP连接的区别,我刚刚接触Socket的时候就曾经为此困扰过。 通常Socket连接就是TCP连接,这里就以TCP连接为例,一旦建立了S

two_bin的专栏 1343

手游功耗优化:从猜想到硬核实测

功耗本质是“硬件在吃电”,要看电流/功率曲线,而不是只看帧率和温度;定量 = 有数字、有曲线、有对比能说“降了 15%”、“峰值从 7W 降到 5.5W”,而不是“我感觉凉快点”;工具方面:大厂会用外接功率仪 + 手机/芯片厂内部平台;平时也会用 Android/iOS/引擎自带的工具做趋势分析;流程上:选典型机型和场景 → 跑脚本采集 → 对齐 Profiler 数据 → 分析 CPU/GPU/网络谁在吃电;再通过版本对比、画质/帧率组合测试,指导配置和优化。这是一个。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 179

最完整的.NET Core Socket通信指南:从入门到实战

在网络编程中,Socket(套接字)是实现跨设备通信的基础组件。你是否还在为如何在.NET Core中构建稳定的Socket通信应用而烦恼?本文将从基本概念到完整示例,带你掌握.NET Core中的Socket编程技术,解决连接不稳定、数据传输异常等常见问题。读完本文,你将能够: - 理解Socket通信的基本原理 - 掌握.NET Core中Socket API的使用方法 - 构建可靠的TCP/...

gitblog_00684的博客 779

杰理 JL701N/JL703N USB MIDI 使用教程

摘要:本教程介绍如何在杰理JL701N/JL703N音箱的可视化SDK中配置USB MIDI功能。主要步骤包括:1)启用PC模式;2)修改SDK宏定义启用USB MIDI;3)实现MIDI数据接收处理逻辑;4)调用接口发送MIDI数据;5)使用MIDI-OX测试功能。针对低版本SDK可能出现的设备识别问题,提供了在midi.c文件中添加特定代码行的解决方案。使用前需确保SDK版本达标,并注意备份原始文件。

qq_42014563的博客 1267

LLC变压器,常见的4大问题解决方案

其中之一是当付边的绕组的匝数或层数较多的时候,层间或匝间寄生电容和付边的漏感发生一个寄生的振荡,轻载的时候,这个振铃的幅度会达到很高,导致输出电压比设计的要高许多。但当输入是低压的时候,开关频率比较低,LLC谐振回路的增益较大,因而比较容易发生变压器饱和的问题。由于LLC变压器工作在LC谐振状态,LC谐振回路有个特点就是Q值问题,在这里Q值是大于1的,因而就会有实际加在变压器上的电压要比输入电压高的问题,因而在设计变压器的时候就必须考虑到这一点,否则变压器就不是工作在你设计的磁感应强度上。

1265

go语言socket编程

go语言socket编程用go写socket非常简单,如果你了解其他语言的socket的话一看便知,如果想深入的话,个人建议看uninx网络编程套接字联网API这本书。在go中,网络协议被封装的非常完好了,我们并不需要像其他语言那样需要socket、bind、listen、receive、connect等一系列的操作,只需要go中自带的net包就可以很方便的完成socket编程。server.gop

chen 3984

华为OD机试2025C卷-双十一最大花费金额[100分](Java_Python3_C++_C语言_JsNode_Go)实现100%通过率

双十一最大花费金额 - 动态规划解法 摘要:本文介绍了华为OD机试中"双十一最大花费金额"问题的动态规划解法。该问题要求在给定N件商品价格和优惠券面额X的情况下,选择若干商品使总花费不超过X且尽可能大。核心解法采用布尔型动态规划数组,记录每个金额是否可被拼出。算法时间复杂度为O(N*X),空间复杂度为O(X)。通过倒序遍历避免重复选择同一商品,最后从X向下查找第一个可达金额作为答案。文中提供了C++和Java的实现代码,并解释了与经典0-1背包问题的关系。 关键点: 问题本质是0-1背包/子集和问题的变体

2503_91057718的博客 46

【亲测免费】 经典 VB.NET Socket 通讯范例:构建网络应用的基石

经典 VB.NET Socket 通讯范例:构建网络应用的基石 【下载地址】经典VB.NET中的Socket通讯范例 此范例演示了如何在 VB.NET 中创建简单的客户端-服务器架构。通过这个实例,您可以学习到:- 如何在服务器端设置监听端口,等待客户端连接。- 客户端如何发起连接至指定的服务器地址和端口。- 实现数据的...

gitblog_09818的博客 973

【PG高可用】一 PostgreSQL高可用方案repmgr部署(非常详细)

repmgr安装部署

DBA之路的博客 7054

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

基于.net的Socket异步编程总结

最近在为公司的分布式服务框架做支持异步调用的开发,这种新特性的上线需要进行各种严格的测试。在并发性能测试时,性能一直非常差,而且非常的不稳定。经过不断的分析调优,发现Socket通信和多线程异步回调存在较为严重的性能问题。经过多方优化,性能终于达标。下面是原版本、支持异步最初版本和优化后版本的性能比较。差异还是非常巨大的。另外说明一下,总耗时是指10000次请求累计执行时间。 从上图可以看到,支持异步的版本,在单线程模式下,性能的表现与老版本差异并不明显,但是10线程下差异就非常巨大,而100线程的测试

chinaherolts2008的博客 536

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 博客园编辑推荐的浏览数bug
下一篇: 何必向不值得的人证明什么,生活得更好,是为了自己
boringY
博客等级 码龄12年 0粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值