最近有项目要做一个高功能网络服务器,决定下功夫搞定完成端口(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
DelphiVCLSkin5.40VCLSkinisacomponenttocreateskinnableuserinterfaceforDelphi/C++Builderapplication,Itiseasytouse,justputonecomponentonmainform,Vclskinwillskinwholeapplicationwithoutsourcecodemodification.Vclskinisleaderinthisfield,Vclskinsupportmostthird-partcontrolsinmarket,thereisn'tacompetitorwasabletosupport3rd-partcontrolsasmanyasVclskin.VclSkinautomaticallyskinkindsofwindowsinapplication,includeDelphiforms,MDIformandco妹妹onWindowsdialogs(MsgBox,Open/Save,Font,Print),eventheExceptionMsgBox.VclskinnotonlysupportDelphistandardcontrols,butalsosupportmanythird-partycomponent,suchasTMSGridpack,EnLibGrid,DeveloperExpressQuantumGrid.Itisanexcellentchoiceforthosewantingtoskinexistingapplications.ThecoolthingisthatitusesexistingVCLcomponents.-InstallRuninstall.exetoinstall.Youalsogethelpinhelp.chm
2015/8/19 8:41:47 8.62MB VCLSkin
1
angular2-热键Angular9和常春藤兼容。
较旧的版本可能有效,但尚未经过官方测试。
安装要安装此库,请运转:$npminstallangular2-hotkeys--save例子首先,将HotkeyModule导入您的根AppModuleimport{HotkeyModule}from'angular2-hotkeys';然后,将HotkeyModule.forRoot()添加到AppModule的导入数组中@NgModule({imports:[CommonModule,HotkeyModule.forRoot(),...],})exportclassAppModule{}如果您有任何也使用热键的子/功能模块,请导入HotkeyModule(但不要导入.forRoot())。
@NgModule({imports:[CommonModule,HotkeyModule,...],})exportclassSharedModul
2017/8/3 20:03:30 149KB angular typescript angular2 hotkeys
1
故事书插件,用于显示React组件的静态符号安装npminstall--save-devstorybook-react-to-static-markup组态添加到.storybook/addons.jsimport'storybook-react-to-static-markup/register'添加到.storybook/config.jsimport{addDecorator}from'@storybook/react'import{withStaticMarkup}from'storybook-react-to-static-mark
1
packagecom.frog.vote.servlet.front;importjava.io.IOException;importjava.sql.Timestamp;importjava.util.ArrayList;importjava.util.List;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.frog.vote.bean.UserBean;importcom.frog.vote.cons.Const;importcom.frog.vote.dao.entity.Vote;importcom.frog.vote.factory.ServiceFactory;publicclassVoteServletextendsHttpServlet{ @Override protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException { doPost(req,resp); } @Override protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException { req.setCharacterEncoding("gbk"); resp.setContentType("text/html;charset=gbk"); //先取出操作参数 Stringaction=req.getParameter("action"); ServletContextapplication=getServletContext(); //显示的列表 if("show".equals(action)) { //调用service层方法得到所有的 Stringtemp=req.getParameter("page"); intpage=1; if(temp!=null) { try { page=Integer.parseInt(temp); } catch(NumberFormatExceptione) { e.printStackTrace(); } } UserBeanub=(UserBean)req.getSession().getAttribute(Const.USER); intuid=ub.getId(); req.setAttribute("page",ServiceFactory .getVoteService().listUserPage(page,uid)); application.getRequestDispatcher("/WEB-INF/front/list.jsp") .forward(req,resp); return; } elseif("save".equals(action)||"update".equals(action)) { Stringsid=req.getParameter("id"); String[]answers=req.getParameterValues("choice"); Listlist=newArrayList(); inttemp; for(Stringanswer:answers){temp=Integer.parseInt(answer);list.add(temp);} inttid=Integer.parse
2022/9/3 9:36:43 577KB jsp+servlet+mysql
1
惊人的时间选择器(时钟)文件和示范您可以在此处阅读和学习惊人的时间选择器和在线演示:一个可视化的时间选择器,可用于2个以上的角度项目。
您可以将此时间选择器与Angular2、4、5、6、7和AngularMaterial一同使用。
该项目不需要角形材料或任何其他依赖项自1.8.0版以来对Angular6,7的支持经过一段时间的延迟,我们现在支持Angular6+。
您也可以在Angular2项目上安装最新版本,并且它向后完全兼容。
如果需要(不应该这样),请为Angular2、4、5安装版本1.6。
*,但它们不会收到更新。
现场演示安装您需要将此存储库安装为依赖项,并将其导入到“imports部分中的app.module.ts中。
npminstallamazing-time-picker--save然后,打开您要在其中使用timepicker的app.module.ts或其他模块,并将其导入并将其添加到imports部分:import{BrowserModule}from'@angular/platform-browser';
2021/4/6 23:35:45 934KB angular angular2 clock timer
1
指南Antmove-小程序转换器,基于支付宝/微信小程序转换为多端小程序,让小程序跨平台开发变得简单。
一键实现小程序转换迁徙,不再为重复开发而烦恼。
特性简单易使用,一键转换配套详细的编译时日志/运行时日志工具编译生成代码可读性强,可二次编程二次编译支持组件转换支持文档安装VsCode扩展安装在vscode扩展中搜索Antmove下载安装Antmovevscode转换插件实现一键转换。
命令行安装我们推荐使用npm或yarn的方式进行开发,不只可在开发环境轻松调试,也可放心地在生产环境打包部署使用,享受整个生态圈和工具链带来的诸多好处。
全局安装$npminstallantmove-g或$yarnglobaladdantmove本地安装$npminstallantmove--save或$yarna
2015/8/10 7:03:26 29.28MB 微信 小程序
1
matlabdir源代码Crop_DiseasesCropDiseasesDetection代码源于Google识别API,根据数据情况做了少许修改。
深度学习框架Tensorflow1.9密码:yq30生成TFrecords运行process.py将数据图像压缩生成TFRecords类型的数据文件,可以提高数据读取效率#修改process.py主函数路径,改为本人的下载后压缩的路径pythonprocess.py训练模型#配置train.sh参数#生成的TFrecords路劲(根据本人的实际修改,下同)DATASET_DIR=/media/zh/DATA/AgriculturalDisease20181023/tf_data#训练过程产生的模型,迭代保存的数据位置TRAIN_DIR=/media/zh/DATA/AgriculturalDisease20181023/check_save/resnetv1_101_finetune#定义预训练模型定义(预训练模型下载地址上面有给出)CHECKPOINT_PATH=/media/zh/DA
2017/8/5 16:52:45 720KB 系统开源
1
让PS支持导出svg图片。
运用:1.解压后放在PS安装目录的/Presets/Scripts下;
2.打开/重启PS;3.做好图后点文件-脚本-SaveasSVG.
2016/7/10 5:27:38 2KB PS SVG JSX
1
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡