最近有项目要做一个高功能网络服务器,决定下功夫搞定完成端口(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
串口假造助手,可以工控机与PLC串口通讯
2021/11/2 18:36:44 913KB Socket
1
https://blog.csdn.net/qq_29542611/article/details/86371353MFC:Socket编程—TCP服务端和多个客户端通讯示例代码
2020/1/19 16:25:09 271KB MFC CSocket MFC 网络编程
1
聊天室使用vanillajs,nodejs和socket.io的简单聊天室使用程序
2015/8/9 16:23:27 21.12MB JavaScript
1
这是一个网络课设,题目是仿真telnet.用socket编程实现客户端与服务器通信,计算四则远算(包括浮点数)。
采用图形化界面。
带有登录功能。
亲身测试,可用,并且作为课设上交检查通过。
2017/9/1 7:55:16 48.76MB socket 四则运算
1
包含socket简历通信连接,socket发送音讯,接收音讯。
2020/10/4 2:44:01 14MB Socket Android 通信 发送
1
在PDA开发时经常会遇到下面的错误,原因是缺少一个dll,只要在项目中引用这个dll就可以获得错误的描述,然后根据错误提示在处理问题!System.Net.WebException:无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集--_-System.Net.Sockets.SocketException:无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集位于System.Net.Sockets.Socket.ConnectNoCheck()位于System.Net.Sockets.Socket.Connect()位于System.Net.Connection.doConnect()位于System.Net.Connection.connect()atWorkItem.doWork()
2015/6/26 18:41:55 271KB 无法显示错误消息
1
精通并发与netty视频教程(2018)视频教程。
精通并发与netty视频教程(2018)视频教程netty视频教程Java视频教程目录:1_学习的要义2_Netty宏观理解3_Netty课程大纲深度解读4_项目环境搭建与Gradle配置5_Netty执行流程分析与重要组件介绍6_Netty回调与Channel执行流程分析7_Netty的Socket编程详解8_Netty多客户端连接与通信9_Netty读写检测机制与长连接要素10_Netty对WebSocket的支援11_Netty实现服务器端与客户端的长连接通信12_GoogleProtobuf详解13_定义Protobuf文件及消息详解14_Protobuf完整实例详解15_Protobuf集成Netty与多协议消息传递16_Protobuf多协议消息支援与工程最佳实践17_Protobuf使用最佳实践与ApacheThrift介绍18_ApacheThrift应用详解与实例剖析19_ApacheThrift原理与架构解析20_通过ApacheThrift实现Java与Python的RPC调用21_gRPC深入详解22_gRPC实践23_GradleWrapper在Gradle项目构建中的最佳实践24_gRPC整合Gradle与代码生成25_gRPC通信示例与JVM回调钩子26_gRPC服务器流式调用实现27_gRPC双向流式数据通信详解28_gRPC与Gradle流畅整合及问题处理的完整过程与思考29_Gradle插件问题处理方案与Nodejs环境搭建30_通过gRPC实现Java与Nodejs异构平台的RPC调用31_gRPC在Nodejs领域中的静态代码生成及与Java之间的RPC通信32_IO体系架构系统回顾与装饰模式的具体应用33_JavaNIO深入详解与体系分析34_Buffer中各重要状态属性的含义与关系图解35_JavaNIO核心类源码解读与分析36_文件通道用法详解37_Buffer深入详解38_NIO堆外内存与零拷贝深入讲解39_NIO中Scattering与Gathering深度解析40_Selector源码深入分析41_NIO网络访问模式分析42_NIO网络编程实例剖析43_NIO网络编程深度解析44_NIO网络客户端编写详解45_深入探索Java字符集编解码46_字符集编解码全方位解析47_Netty服务器与客户端编码模式回顾及源码分析准备48_Netty与NIO系统总结及NIO与Netty之间的关联关系分析49_零拷贝深入剖析及用户空间与内核空间切换方式50_零拷贝实例深度剖析51_NIO零拷贝彻底分析与Gather操作在零拷贝中的作用详解52_NioEventLoopGroup源码分析与线程数设定53_Netty对Executor的实现机制源码分析54_Netty服务端初始化过程与反射在其中的应用分析55_Netty提供的Future与ChannelFuture优势分析与源码讲解56_Netty服务器地址绑定底层源码分析57_Reactor模式透彻理解及其在Netty中的应用58_Reactor模式与Netty之间的关系详解59_Acceptor与Dispatcher角色分析60_Netty的自适应缓冲区分配策略与堆外内存创建方式61_Reactor模式5大角色彻底分析62_Reactor模式组件调用关系全景分析63_Reactor模式与Netty组件对比及Acceptor组件的作用分析64_Channel与ChannelPipeline关联关系及模式运用65_ChannelPipeline创建时机与高级拦截过滤器模式的运用66_Netty常量池实现及ChannelOption与Attribute作用分析67_Channel与ChannelHandler及ChannelHandlerContext之间的关系分析68_Netty核心四大组件关系与构建方式深度解读69_Netty初始化流程总结及Channel与ChannelHandlerContext作用域分析70_Channel注册流程深度解读71_Channel选择器工厂与轮询算法及注册底层实现72_Netty线程模型深度解读与架构设计原则73_Netty底层架构系统总结与应用实践74_Netty对于异步读写操作的架构思想与观察者模式的重要应用75_适配器模式与模板方法模式在入站处理器中的应用76_Netty项目开发过程中常见且重要事项分析77_JavaNIOBuffer总结回顾与难点拓展78_Netty数
2018/11/3 6:48:04 108KB 精通并发 netty 视频教程 高并发
1
java聊天室程序源码2需求分析2.1业务需求1.与聊天室成员一起聊天。
2.可以与聊天室成员私聊。
3.可以改变聊天内容风格。
4.用户注册(含头像)、登录。
5.服务器监控聊天内容。
6.服务器过滤非法内容。
7.服务器发送通知。
8.服务器踢人。
9.保存服务器日志。
10.保存用户聊天信息。
2.2系统功能模块2.2.1服务器端1.处理用户注册2.处理用户登录3.处理用户发送信息4.处理用户得到信息5.处理用户退出2.2.2客户端1.用户注册界面及结果2.用户登录界面及结果3.用户发送信息界面及结果4.用户得到信息界面及结果5.用户退出界面及结果2.3功能需求运行环境:Windows9x、2000、xp、2003,Linux必要环境:JDK1.5以上硬件环境:CPU400MHz以上,内存64MB以上3.1.2客户端结构ChatClient.java为客户端程序启动类,负责客户端的启动和退出。
Login.java为客户端程序登录界面,负责用户帐号信息的验证与反馈。
Register.java为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。
ChatRoom.java为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器端的Connection.java亲密合作。
Windowclose为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。
Clock.java为客户端程序的一个小程序,实现的一个石英钟功能。
3.2系统实现原理当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。
接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为3秒最佳,因为每个用户都不可能在3秒内连续发送信息。
当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。
4.1.1问题陈述1.接受用户注册信息并保存在一个基于文件的对象型数据库。
2.能够允许注册过的用户登陆聊天界面并可以聊天。
3.能够接受私聊信息并发送给特定的用户。
4.服务器运行在自定义的端口上#1001。
5.服务器监控用户列表和用户聊天信息(私聊除外)。
6.服务器踢人,发送通知。
7.服务器保存日志。
2018/11/6 12:08:27 10.71MB java Socket 聊天程序可进行私聊和公聊
1
自己写的一个网络白板程序,有客户端和服务器端,服务器实现多线程,并且可以实时显示连接数及连接的ip,客户端实现绘图功能,并把图像发到服务器端,服务器转发给其他客户端。
代码是用java写的,采用的基本Server/Client的方式实现。
网络白板是非常适合初学者研究的一个项目,对于是用socket,了解s/c机制有些协助。
我的代码也写得十分简单,功能也比较齐全,而且这个是福利资源,大家快来下!
2021/2/5 11:32:35 56KB 网络白板 画图板 java socket
1
共 752 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡