服务器设计笔记(4)-----客户端通信模块

简介:

   整个底层通信模块修改过很多次,因为首次使用epoll,在其中遇见了很多问题,最终设计成下面的方式:

   

   1: 对于epoll中EPOLLOUT事件的使用,因为频繁的调用send()函数,系统会在内核模式和用户模式之间切换太多消耗太大,所以最终启用了定时器模式,比如以50ms为间隔,定时的遍历所有的ClientPlayer 去发送 OutStream 里面的数据。

   2: 最开始使用玩家的id 对应每个玩家的ClientPlayer的,在玩家没有进入的时候 使用玩家的账号名; 后来增加了一个map,用玩家id去映射对应的socket,在用socket 去映射对应的Clientplayer。

   3:   对于epoll中的EPOLLOUT事件,因为启用的是边缘模式,所以在连接刚建立的时候会触发这个事件,但是如果在之后再想通过这个时间的触发去发送数据就不可能了。所以尽量还是不要使用EPOLLOUT事件去做发送处理。

   4: 每个连接都有自己的缓存,当缓存慢的时候就做异常处理,将这个客户端断开。

   5: 最先设计的时候,是做成了多进程,后来修改成了单进程多线程模式。可能疑问单进程会不会影响在线,本来场景内的玩家确实要处理走动逻辑,后来考虑到这是一个模拟经营类游戏,玩家可能不关系走动逻辑的一致性,所以就去掉了服务器走动逻辑的处理,交给了客户端处理。没有这个压力,服务器压力小很多。 

   6: 消息的接受和发送做在了一个线程里,不同类型的消息的处理坐在了不同的线程里。两者通过上篇讲到的消息队列进行通信。

   7: 所有的底层API函数包括epoll相关,socket相关都做了一封装。

相关文章
|
1月前
|
XML 前端开发 JavaScript
探索 XMLHttpRequest:网页与服务器的异步通信之道(上)
探索 XMLHttpRequest:网页与服务器的异步通信之道(上)
|
2月前
|
消息中间件 运维 网络协议
客户端和服务器之间的通信
客户端和服务器之间的通信
32 0
|
2月前
|
监控 关系型数据库 Linux
|
3月前
|
Linux
CentOS7.9服务器一键脚本部署FRP内网穿透服务端与客户端
CentOS7.9服务器一键脚本部署FRP内网穿透服务端与客户端
216 0
|
16天前
|
网络协议 Python
pythonTCP客户端编程连接服务器
【4月更文挑战第6天】本教程介绍了TCP客户端如何连接服务器,包括指定服务器IP和端口、发送连接请求、处理异常、进行数据传输及关闭连接。在Python中,使用`socket`模块创建Socket对象,然后通过`connect()`方法尝试连接服务器 `(server_ip, server_port)`。成功连接后,利用`send()`和`recv()`进行数据交互,记得在通信完成后调用`close()`关闭连接,确保资源释放和程序稳定性。
|
3月前
|
网络协议
网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)(下)
网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)
35 2
|
1月前
|
JSON 安全 网络安全
探索 XMLHttpRequest:网页与服务器的异步通信之道(下)
探索 XMLHttpRequest:网页与服务器的异步通信之道(下)
|
1月前
|
存储 网络协议 数据可视化
如何使用Synology Drive作为文件同步服务器实现云同步Obsidian笔记
如何使用Synology Drive作为文件同步服务器实现云同步Obsidian笔记
|
2月前
|
网络协议 Java API
【JavaEE初阶】 TCP服务器与客户端的搭建
【JavaEE初阶】 TCP服务器与客户端的搭建
|
2月前
|
自然语言处理 Java 编译器
【JavaEE初阶】 UDP服务器与客户端的搭建
【JavaEE初阶】 UDP服务器与客户端的搭建