[asp.net]开发高性能服务器须知

简介: 要编写高性能的Socket服务器,为每个接收的Socket分配独立的处理线程的做法是不可取的,当连接数量很庞大时,服务器根本无法应付。要响应庞大的连接数量,需要使用IOCP(完成端口)来撤换并处理响应。

要编写高性能的Socket服务器,为每个接收的Socket分配独立的处理线程的做法是不可取的,当连接数量很庞大时,服务器根本无法应付。要响应庞大的连接数量,需要使用IOCP(完成端口)来撤换并处理响应。

.net framework的System.Net.Sockets.Socket 类有一组xxxAsync方法是封装了IOCP的处理,用于编写高性能Socket应用程序,xxxAsync该组方法需要结合SocketAsyncEventArgs类来使用,下面是MSDN参考资料,里面有一个详细的例子:

http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx

Socket类xxxAsync的方法,使用起来比较复杂,需要时间消化上述的例子,结合实际编写所需的操作。

 

以下是使用SocketAsyncEventArgs时应该注意的地方:

1.连接和接收时不要使用一个SocketAsyncEventArgs对象,如下面代码,accept和receive是不同的对象,不用使用同一个SocketAsyncEventArgs调用AcceptAsync和ReceiveAsync方法。

    SocketAsyncEventArgs accept = _RequestPool.PopOrNew();

    bool raise = _Listener.AcceptAsync(accept);

    …

    SocketAsyncEventArgs receive = _RequestPool.PopOrNew();

    receive.SetBuffer(http.ReceiveBuffer, 0, http.ReceiveBuffer.Length);

    bool raise = http.Socket.ReceiveAsync(receive);

2.应该使用可伸缩的SocketAsyncEventArgsPool连接池缓存,如下面的PopOrNew方法,其他数据缓存类似。

    class SocketAsyncEventArgsPool

    {

        Stack<SocketAsyncEventArgs> _Pool;

        public SocketAsyncEventArgsPool()

        {

            _Pool = new Stack<SocketAsyncEventArgs>();

        }

        public void Push(SocketAsyncEventArgs item)

        {

            if (item == nullreturn;

            lock (_Pool)

            {

                _Pool.Push(item);

            }

        }

        public SocketAsyncEventArgs PopOrNew()

        {

            if (Count == 0)

                return new SocketAsyncEventArgs();

            return Pop();

        }

        public SocketAsyncEventArgs Pop()

        {

            lock (_Pool)

            {

                return _Pool.Pop();

            }

        }

        public int Count

        {

            get { return _Pool.Count; }

        }

        public void Clear()

        {

            while (Count > 0)

            {

                Pop().Dispose();

            }

        }

    }

3.当接收到长度为0的数据时,表明客户端关闭Socket,这时应该开始执行服务端的Socket关闭操作。

    private void OnReceive(SocketAsyncEventArgs receive)

    {

        try

        {

            if (receive.SocketError == SocketError.Success && receive.BytesTransferred > 0)

            {

                //处理接收

                …

            }

            else

            {

                Close(receive); //关闭Socket

            }

        }

        catch (Exception ex)

        {

            TraceError(ex);

        }

    }


转自

相关文章
|
1月前
|
SQL 开发框架 数据可视化
企业应用开发中.NET EF常用哪种模式?
企业应用开发中.NET EF常用哪种模式?
|
1月前
|
存储 资源调度 应用服务中间件
浅谈本地开发好的 Web 应用部署到 ABAP 应用服务器上的几种方式
浅谈本地开发好的 Web 应用部署到 ABAP 应用服务器上的几种方式
24 0
|
2月前
|
开发框架 JavaScript 前端开发
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
|
2月前
|
网络协议 IDE 网络安全
GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程
GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程
81 0
|
2天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
14天前
|
存储 缓存 NoSQL
Redis 服务器指南:高性能内存数据库的完整使用指南
Redis 服务器指南:高性能内存数据库的完整使用指南
|
28天前
|
数据安全/隐私保护 Windows
.net三层架构开发步骤
.net三层架构开发步骤
9 0
|
28天前
深入.net平台的分层开发
深入.net平台的分层开发
46 0
|
1月前
|
网络协议 Ubuntu Linux
「远程开发」VSCode使用SSH远程linux服务器 - 公网远程连接
「远程开发」VSCode使用SSH远程linux服务器 - 公网远程连接
108 0
|
1月前
|
Java 关系型数据库 应用服务中间件
webgis Web 服务器端开发
webgis Web 服务器端开发
23 1