最近有项目要做一个高功能网络服务器,决定下功夫搞定完成端口(IOCP),最终花了一个星期终于把它弄清楚了,并用C++写了一个版本,效率很不错。
但,从项目的总体需求来考虑,最终决定上.net平台,因此又花了一天一夜弄出了一个C#版,在这与大家分享。
一些心得体会:1、在C#中,不用去面对完成端口的操作系统内核对象,Microsoft已经为我们提供了SocketAsyncEventArgs类,它封装了IOCP的使用。
请参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1。
2、我的SocketAsyncEventArgsPool类使用List对象来存储对客户端来通信的SocketAsyncEventArgs对象,它相当于直接使用内核对象时的IoContext。
我这样设计比用堆栈来实现的好处理是,我可以在SocketAsyncEventArgsPool池中找到任何一个与服务器连接的客户,主动向它发信息。
而用堆栈来实现的话,要主动给客户发信息,则还要设计一个结构来存储已连接上服务器的客户。
3、对每一个客户端不管还发送还是接收,我使用同一个SocketAsyncEventArgs对象,对每一个客户端来说,通信是同步进行的,也就是说服务器高度保证同一个客户连接上要么在投递发送请求,并等待;
或者是在投递接收请求,等待中。
本例只做echo服务器,还未考虑由服务器主动向客户发送信息。
4、SocketAsyncEventArgs的UserToken被直接设定为被接受的客户端Socket。
5、没有使用BufferManager类,因为我在初始化时给每一个SocketAsyncEventArgsPool中的对象分配一个缓冲区,发送时使用Arrary.Copy来进行字符拷贝,不去改变缓冲区的位置,只改变使用的长度,因此在下次投递接收请求时恢复缓冲区长度就可以了!如果要主动给客户发信息的话,可以new一个SocketAsyncEventArgs对象,或者在初始化中建立几个来专门用于主动发送信息,因为这种需求一般是进行信息群发,建立一个对象可以用于很多次信息发送,总体来看,这种花销不大,还减去了字符拷贝和消耗。
6、测试结果:(在我的笔记本上时行的,我的本本是T420I78G内存)100客户100,000(十万次)不间断的发送接收数据(发送和接收之间没有Sleep,就一个一循环,不断的发送与接收)耗时3004.6325秒完成总共10,000,000一千万次访问平均每分完成199,691.6次发送与接收平均每秒完成3,328.2次发送与接收整个运行过程中,内存消耗在开始两三分种后就保持稳定不再增涨。
看了一下对每个客户端的延迟最多不超过2秒。
2020/5/13 2:27:34 15KB IOCP 完成端口 源码
1
案例中数据来自MySQL数据库,对查询出来的数据缓存到redis,redis缓存工具可以将缓存string,bean,list,map等类型,代码中有详细的注释,而且还将要缓存的数据进行了序列化,大家可以自创,进而更改成自己想要的格式。
数据库配置使用了xml和propertis两种配置方式,redis缓存采用非切片和切片两种配置,大家可以自选择
2019/4/6 23:36:46 2.37MB Java MySQL redis缓存
1
欢迎来到GitHubPages您可以使用的来维护和预览Markdown文件中网站的内容。
每当您提交到该存储库时,GitHubPages都会运行从Markdown文件中的内容重建站点中的页面。
降价促销Markdown是一种轻巧且易于使用的语法,可用于样式化您的文字。
它包括以下约定Syntaxhighlightedcodeblock#Header1##Header2###Header3-Bulleted-List1.Numbered2.List**Bold**and_Italic_and`Code`text[Link](url)and![Image](src)有关更多详细信息,请参见。
吉柯主题您的Pages网站将使用您在选择的Jekyll主题的规划和样式。
该主题的名称保存在Jekyll_conf
2019/2/11 7:37:33 407KB
1
Listonic,聪明的杂货店购物清单是一个免费的应用程序,它可以使杂货店购物变得更轻松,更快,最重要的是更智能,从而提高了杂货店购物的质量。
这就是您想要从购物清单中获得的更多信息。
为什么要使用Listonic–我们知道您感谢您的空闲时间,我们知道您希望尽快购物。
而且我们知道您购物清单中大约70%的产品是重复性的。
这就是Listonic现在建议您最喜欢的产品的原因。
现在,您只需一次轻按即可添加数量!–能否需要更改?不喜欢您喜欢的西葫芦面食吗?停止哭泣,并开始与Listonic一起组织每周菜单。
浏览我们的目录:您会发现许多按照过道顺序分类的产品灵感。
轻松滑动,轻松选择!
2016/6/26 17:53:21 28.46MB Grocery Shopping List Listonic
1
在jdk为1.7当中,不支持elasticSearch2.4以上,这里的资源为elasticSearch2.3.5加上对应elasticSearch版本的ik分词器,和gson的jar包,可以处理json到实体类,map,list的转换。
在项目中会运用到
2015/5/22 13:44:12 30.75MB 全文检索
1
1、cocoscreator使用mask+skew的方法实现搓牌功能2、这是以前项目中的模块,现在提取出来,当初摸索着写的难免有弯路,仅供学习参考。
creator版本为1.9.3,稍微做修正就可以用2.0及新版本使用。
3、效果图请移步:https://pan.baidu.com/s/11v096Bbi3PmqbAEL7Uonew#list/path=/我的分享/CSDN/CardDemo4、如有疑问,请留言。
2015/6/22 16:21:01 4.27MB cocoscreator 搓牌 mask skew
1
AIX操作系统的四种安装方式:完全覆盖安装:操作系统被安装在rootvg的第一块硬盘上,这将覆盖原系统中所有的系统保留目录。
保留安装:这种安装方式可以保留操作系统的版本不变,同时保留rootvg上的用户数据,但将覆盖/usr、/tmp、/var和/目录。
用户还可以利用/etc/preserve.list指定系统安装时需求保留的文件系统。
默认的需保留的文件系统为/etc/filesystem中所列。
升级安装:这种安装方式用于操作系统的升级,这将覆盖/tmp目录。
这是系统默认的安装方式。
备份带安装:恢复用mksysb命令生成的安装带中/image.data中指定的文件系统
2015/7/6 13:17:21 513KB aix
1
『菜鸟商城』仿淘宝客户端电商平台视频+源码百度网盘下载地址视频目录:1:课程大纲及运行效果介绍13:022:用fragmentTabHost实现底部菜单36:343:ToolBar的基本使用16:194:自定义ToolBar26:205:酷炫轮播广告22:176:RecyclerView详细介绍31:257:首页商品分类17:588:okHttp的使用28:269:OkHttp简单封装39:4610:主页商品分类重构15:0311:Fresco(FaceBook)使用介绍28:0312:下拉刷新SwipeRefreshLayout控件介绍17:1113:热门商品列表实现(下拉刷新,上拉加载更多)38:5314:Adapter封装29:1215:一级商品分类实现22:5016:二级商品列表实现19:2917:自定义数字加减控件28:2118:购物车数据存储器实现21:3319:显示购物车商品26:3720:购物车商品选择和总价统计15:3421:购物车编辑实现14:5722:分页工具类封装30:1823:商品排序功能实现(TabLayout)22:2024:商品列表list和grid模式切换实现10:5825:Native与HTML5交互32:4826:使用HTML5实现商品详情30:5927:商品分享(SharedSDK)23:1128:用户登录28:1629:API权限验证20:3030:App登录拦截14:5331:短信SDK集成26:0932:获取短信验证码27:4633:校验验证码和完成注册19:2634:支付SDK集成22:4135:提交订单29:4536:支付(支付宝,微信,百度钱包)订单12:4037:添加收货地址17:3338:收件地址管理20:1339:我的13:5440:我的订单24:0341:我的珍藏06:0642:完结篇
1
采用简单的MVC设计模式,M(模型层)->Address.java里面包含id,name,street,city,state,zip等相关属性和set,get方法V(视图层)->次要指jsp页面,包含list.jsp,add.jsp,edit.jspC(控制层)->这里只用一个servlet实现其增删改查(简单明了,方便理解)
2018/10/16 8:49:16 745KB java 增删改查 jsp servlet
1
系统主要实现功能,界面不美观,见谅,该系统用ajax实现系统实现如图所示:基本功能模糊查询,分页,添加学生信息,删除学生信息,选课等,如果该学生选过课先回显学生选过的课程,前往按钮重新载入list.jsp页面,本系统主要用ajax实现在一个list页面内实现对学生的操作,不进行页面跳转,主要是练习运用jquerty,ajax,里面包含数据库,只是界面不太美观,如果要嵌入别到的网页上,出现问题欢迎在我的博客留言,或者加我qq1005089371,嵌入到别的网页如果部分列表或功能无法实现,请尝试把所有的js代码写入到body中,因为加载的时候嵌入的页面只加载body内容,js无法加载,所以把js写到body中
1
共 180 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡