c# socket 框架学习 SocketAsyncEventArgsPool 封装

    public class SocketAsyncEventArgsPool{
        //已使用记录
        private List<Int32> usedRecord;
        //未使用记录
        private List<Int32> unUsedRecord;
        //池子
        private List<SocketAsyncEventArgsMetadata> pool;
        //池子最大容量
        private int capacity;
        //是否动态扩展容量
       // private bool dynamic = false;

        /**池子初始化*/
        private void init() {
            this.pool = new List<SocketAsyncEventArgsMetadata>(this.capacity);
            this.usedRecord = new List<Int32>(this.capacity);
            this.unUsedRecord = new List<Int32>(this.capacity);
            for (int i = 0; i < this.capacity; i++) {
                this.unUsedRecord.Add(i);
                this.pool.Add(SocketAsyncEventArgsMetadata.valueOf(i));
            }
        }

        ///////////////////公开方法////////////////////////
        /**获取可使用数量**/
        public int GetUsedCount()
        {
            return this.capacity - this.usedRecord.Count;
        }
        /**获取可使用 SocketAsyncEventArgs */
        public SocketAsyncEventArgsMetadata Pop()
        {
            int index = 0;
            lock(this){
                if (GetUsedCount() <= 0)
                {
                    extCapacity();
                }
                index = this.unUsedRecord[0];
                this.unUsedRecord.RemoveAt(0);
                this.usedRecord.Add(index);
                return this.pool[index];
            }
        }
        /**回收 SocketAsyncEventArgs */
        public void Push(SocketAsyncEventArgsMetadata args)
        {
            int index = 0;
            lock (this)
            {
                index = args.GetIndex();
                this.unUsedRecord.Add(index);
                this.usedRecord.Remove(index);
            }
        }

        /** 扩展容量   */
        private void extCapacity()
        {
            int minNewCapacity = 200;
            int newCapacity = Math.Min(this.capacity, minNewCapacity);

            //每次以minNewCapacity倍数扩展
            if (newCapacity > minNewCapacity)
            {
                newCapacity += minNewCapacity;
            }
            else {
                //以自身双倍扩展空间
                newCapacity = 64;
                while (newCapacity < minNewCapacity)
                {
                    newCapacity <<= 1;
                }
            }

            for (int i = this.capacity; i < newCapacity; i++) {
                this.unUsedRecord.Add(i);
                this.pool.Add(SocketAsyncEventArgsMetadata.valueOf(i));
            }

            this.capacity = newCapacity;
        }

        //getter

        public int GetCapacity() {
            return this.capacity;
        }

        /**构建方法*/
        public static SocketAsyncEventArgsPool valueOf(int maxCapacity)
        {
            SocketAsyncEventArgsPool result = new SocketAsyncEventArgsPool();
            result.capacity = maxCapacity;
            result.init();
            return result;
        }
    }
   public class SocketAsyncEventArgsMetadata : SocketAsyncEventArgs
    {
       /**记录索引**/
       private int index;
       private SocketAsyncEventArgs args;

       public static SocketAsyncEventArgsMetadata valueOf(int index) {
           SocketAsyncEventArgsMetadata result = new SocketAsyncEventArgsMetadata();
           result.index = index;
           return result;
       }

       internal int GetIndex()
       {
           return this.index;
       }
    }

测试类:

 class TestPool
    {
        private int count = 200;
        public void test() {
            SocketAsyncEventArgsPool pool = SocketAsyncEventArgsPool.valueOf(4);

            for (int i = 0; i < count; i++) {
                Thread th = new Thread(pop);
                th.Start(pool);
            }

        }

        private void pop(object msg)
        {
            ((SocketAsyncEventArgsPool)msg).Pop();
        }

    }
时间: 2024-10-10 14:07:37

c# socket 框架学习 SocketAsyncEventArgsPool 封装的相关文章

某智能家居项目框架学习总结

这个月来第一篇博客,各种其他事情.. 之前负责过一个智能家居项目的二次开发,苏州一家公司做的,项目还是分了好几个系统,对业务流程的不同部分进行了划分,我是此项目的主要负责人,通过老师的指导,对这个项目也有了一些了解.此项目运用了一些框架,有些也是我第一次接触到的,下面将对项目用到的一些框架进行总结. 下面可能会出现几个有关智能家居的名词,介绍一下 1.机顶盒:每一个家庭都应该至少有一个机顶盒,控制电器开关都是由机顶盒向各电器的接收器发送命令 2.客户端:也就是用户的移动设备,手机.平板都可以,我

从零开始编写自己的C#框架——框架学习补充说明

非常感谢轩辕公子提出了对本框架的看法与意见,所以这里也将回复贴出来,让大家都了解一下 本系列的快速开发指的是,框架构建完毕后,在这个基础上开发新功能非常快捷方便,基本不用写太多代码就可以在短时间内完成大量的基本功能.当然如果直接将全部代码贴出来,直接上例子的话可能更容易理解,但这样的话对于很多想了解整个框架实现过程的朋友来说,一下子太多代码就很难理解最初的思路了,同时大家也看到每一章都会附上独立的解决方案也是这么一回事,通过循序渐进的方式来进行学习.原本想要写得更细更多章节的,但由于个人空闲时间

Struts2框架学习(一)

Struts2框架学习(一) 1,Struts2框架介绍 Struts2框架是MVC流程框架,适合分层开发.框架应用实现不依赖于Servlet,使用大量的拦截器来处理用户请求,属于无侵入式的设计. 2,Struts2框架的流程原理 1)请求先到达Filter中央控制器 2)然后为Action创建代理类 3)将各个服务存放在拦截器中,执行完拦截器后再去执行action类行action类,action类调用service,再调用dao 4)得到结果字符串,创建result对象 5)转向相应的视图.

Struts2框架学习(三) 数据处理

Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:ValueStack一种数据结构,操作数据的方式为:先进后出 OGNL : Object-GraphNavigation Language(对象图形导航语言)将多个对象的关系使用一种树形的结构展现出来,更像一个图形,那么如果需要对树形结构的节点数据进行操作,那么可以使用 对象.属性 的方式进行操作,OGNL技

TCP协议和socket API 学习笔记

本文转载至 http://blog.chinaunix.net/uid-16979052-id-3350958.html 分类: 原文地址:TCP协议和socket API 学习笔记 作者:gilbertjuly  • TCP包头 ACK为1时,确认序号有效,表示期望收到的下一个序号,是上次成功收到的字节序加1. SYN, FIN都占用一个序号. • TCP连接的建立 client通过connect()来建立TCP连接,connect()会发送SYN报文: server通过bind().list

C#框架学习资料集锦

1.AllEmpty 的[从零开始编写自己的C#框架]系列 从零开始编写自己的C#框架(1)--前言从零开始编写自己的C#框架(2)--开发前的准备工作从零开始编写自己的C#框架(3)--开发规范从零开始编写自己的C#框架(4)--文档编写说明从零开始编写自己的C#框架(5)--三层架构介绍从零开始编写自己的C#框架(6)--SubSonic3.0插件介绍从零开始编写自己的C#框架(7)--需求分析从零开始编写自己的C#框架(8)--后台管理系统功能设计从零开始编写自己的C#框架(9)--数据库

Spring框架学习1

AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理 Spring框架学习(一) 阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP: Spring DAO: Spring ORM: Spring Web 模块: Spring MVC 框架: 二.实例化spring容器 三.利用Spring容器创建javaBean对象 1,用构造器实例化 2,使用静态工厂方法实例化 3,实例工厂实例化 四,容器的IOC应用 4.1)Set注入 4.2)

SuperSocket框架学习笔记4-SuperWebSocket---使用SubCommandBase

首先下载所需要的 DLL http://download.csdn.net/detail/wai2dance123/7389285 或者参见第2章  到SuperSocket官网下载 http://www.cnblogs.com/xmcrew/p/3747354.html 1,新建一个 .NET4.0 控制台应用程序 命名为 DiyServers 添加以下引用 将默认的Program.cs改名为  DiyServers.cs 并添加以下命名空间 2,写自己的DSession和DServer继承自

socket框架续,异步socket

上一篇对socket进行了简单的封装,但是由于send和recv都是同步的,真正使用的时候一般都需要异步的,如果让应用层自己负责维护异步线程,那这个框架就不实用了,所以异步收发还是要有的. 不知道怎么说起,先占坑以后再慢慢说吧. 我的实现方法: 1.创建SendBuffer和RecvBuffer,包装发送和接收的消息. 2.使用循环队列创建发送队列和接收队列,异步调用只需要将消息加入队列.(循环队列的实现可以参考 http://www.cnblogs.com/wolfred7464/p/4337