开发高性能的Socket服务器

news/2024/7/4 0:48:59 标签: socket, 服务器, exception, class, .net, null
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

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

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

http://msdn.microsoft.com/zh-cn/library/system.net.class="tags" href="/tags/SOCKET.html" title=socket>sockets.class="tags" href="/tags/SOCKET.html" title=socket>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 == null) return;

            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);

        }

    }


http://www.niftyadmin.cn/n/1574724.html

相关文章

驭龙HIDS安装及测试

0x00、安装前准备工作1、服务端&#xff1a;192.168.89.180&#xff08;4GB内存,需要安装mongodb,elasticsearch,下载驭龙的编译好的包上传/home并运行web&#xff0c;然后初始化&#xff0c;最后运行server端&#xff0c;然后查看所有端口号是否开启&#xff1a;9200&#xff…

我的HTTP服务器(2)

上一篇&#xff1a;我的HTTP服务器 自从开发了属于自己的http服务器&#xff0c;随着功能的逐渐完善&#xff0c;一个实用的技术框架逐渐形成。 前端实用flex技术平台发布应用&#xff0c;与用户进行交互。 后端http服务器处理flex前端的http请求。 自定义的http服务器拥有…

Flex:MyReport演示下载连接和相关文章索引

演示地址Flex集成方式演示地址2(旧版2.6)HTML集成方式演示地址1 MyReport产品网站 NEW相关文章------------------------2.6以下版本----------------------------------MyReport报表引擎介绍Web报表引擎——MyReport 2.6.4.0新功能MyReport数据导出引擎——MyReport的好帮手&a…

TouchListener与OnclickListener

转载于:https://blog.51cto.com/13498753/2126720

Flex:Web报表引擎——MyReport 2.1.0.0新功能

新增功能 支持简单的四则运算 例子1&#xff1a;算总分&#xff0c;简单连加 例子2&#xff1a;算平均分&#xff0c;除非和加法混合(能够识别先乘除后加减&#xff0c;不支持小括号优先运算) 新增行号函数 直接生成行号 新增多种格式化设置 修复数个已发现的Bug。 …

课件播放器2.0

能够支持AICC&#xff0c;SCORM类型的elearning课件的离线播放和学习状态跟踪。 效果图

Spring Cloud微服务架构代码结构详细讲解

2019独角兽企业重金招聘Python工程师标准>>> 上一篇我们介绍了spring cloud云服务架构 - particle云架构代码结构&#xff0c;简单的按照几个大的部分去构建代码模块&#xff0c;让我们来回顾一下&#xff1a; 第一部分&#xff1a; 针对于普通服务的基础框架封装&a…

Flex:Web报表引擎——MyReport 2.2.0.0新功能

新增功能 分组功能增加分组头&#xff0c;分组尾设计支持&#xff0c;支持按字段分组&#xff0c;排序 分组效果 排序效果 新增分组行号函数&#xff0c;用于分组内部独立行号显示 分组行号效果 新增平均函数&#xff0c;用于求平均值统计 支持四则优先运算(用中括号表…