网络游戏TCP长连接基本设计

基本结构

从基本结构上,我主要封装了三个类,Protocol->TcpClient->MsgHandler,这三者依次从底层到应用层,主要分别处理数据与协议、tcp socket收/发、消息处理,下面简单说说。

Protocol

主要提供数据转换接口,并定义了协议。

数据转换接口主要是:StructToBytes和BytesToStruct,C#上的实现利用了Marshal。

协议由消息头和消息内容构成,消息头包含协议size和id,消息内容就是纯bytes。

TcpClient

这里具体处理了socket的连接/断开/发送/接收等。主要对外提供了Init/Connect/Disconnect/Send/Recv/IsConnect等接口。

MsgHandler

这是TCP模块对外的应用接口,开启一个消息处理线程,在后台处理消息收发。主要实现以下功能:

1. 初始化

2. 消息注册。基本的观察者模式

3. 打开连接/断开连接/重新连接等

4. 发送消息

5. 消息处理。处理具体的消息发/收,后面贴上这块的实现代码片段。

6. 心跳包。每隔5s自动发心跳包,检查网络连接。

7. 销毁。做清理工作。

消息处理

直接上代码片段,简单注释

// 初始化时开启消息处理线程
m_pobjMsgThread = new Thread(new ThreadStart(this.ProcessMsg));
m_pobjMsgThread.Name = "thread_msg";
m_pobjMsgThread.IsBackground = true;
m_pobjMsgThread.Start();
// 消息处理
void ProcessMsg() {
    while (m_bFlagRun) {
        if (m_bReconnect) { // 处理reconnect请求
            this.DoDisconnect();
            m_bReconnect = false;
        }

        if (!this.IsConnected() && m_bAutoConnect) {// 处理断线
            this.DoConnect(m_strAddress, m_strPort);
            Thread.Sleep(0);
            if (!this.IsConnected())
                Thread.Sleep(kReconnectionTime);
            continue;
        }

        if (m_msgQue.Count() > 0) {// 消息发送,一次把所有消息缓存都发送
            lock (m_msgQue) {
                while (m_msgQue.Count() > 0) {
                    m_msgQueBuffer.Enqueue(m_msgQue.Dequeue());
                }
            }

            while (m_bFlagSend && m_msgQueBuffer.Count > 0) {
                Msg msg = m_msgQueBuffer.Dequeue();
                this.m_pobjTcpClient.Send(msg.bytes, msg.length);
            }
        }

        if (m_bFlagRecv) // 消息接收
            m_pobjTcpClient.Recv();

        Thread.Sleep(5);
    }
}

优化

为了保证IO不卡顿,发送消息接口(Send)只是把消息丢到一个queue里,具体的发送是在单独的线程(ProcessMsg)里处理的。

消息接收(Recv)也可能会有IO瓶颈,这块的优化需要在业务逻辑里根据具体情况处理。比如我们原来一款RPG游戏,在主角进入人堆(比如城里摆摊、国战)或怪堆(比如副本里局部有很多小怪)里的时候,会瞬时收到几十条甚至数百条创建人/怪的消息,我也是采用了类似于前面消息发送的缓存机制,把创建人/怪的消息缓存到一个queue里,然后在游戏每一帧创建一个,大大改善了IO卡顿。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-27 21:18:59

网络游戏TCP长连接基本设计的相关文章

极限优化:php巧用tcp长连接

极限优化:php巧用tcp长连接 提交 我的评论 加载中 已评论 极限优化:php巧用tcp长连接 2015-01-23 架构师之路 架构师之路 架构师之路 微信号 功能介绍 通往架构师之路,悠远而漫长,一路上,我们同行. 上一期,和大家分享了YouTube系统架构,本期将和大家分享一个大并发下php使用tcp长连接访问后端的优化方法. php巧用TCP长连接优化 一.面向人群如果你的站点架构满足以下几点,那么本文的优化方案会非常适合你:1)使用php等脚本语言作为开发语言2)需要连接后端服务,

TCP长连接与短链接

1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的 经典的三次握手示意图: 经典的四次握手关闭图: 2. TCP短连接我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接.client向server发送消息,ser

基于Apache mina 的android 客户端tcp长连接实现

TCP-long-connection-based-on-Apache-mina 基于Apache mina 的tcp长连接实现,可用于android客户端推送. 项目Github地址:https://github.com/sddyljsx/Android-tcp-long-connection-based-on-Apache-mina 项目将Apache的mina项目移植到了android平台.实现长连接的主要思想是使用了mina的KeepAliveFilter过滤器. acceptor.ge

多进程解决datasnap支持的tcp长连接数量少的问题

对于实时采集数据的项目,应用场景比如是这样的:5000客户端,每个客户端每隔500MS要给服务器上传一次数据. 大家知道,像INDY这种阻塞型的通信控件,所能支持的TCP长连接的一般地不能超过1000的数量(如果想要维持稳定运行的话). 原因是大家都晓得的,阻塞方式会为每一个SOCKET连接创建一个新的线程为之服务,而WINDOWS单个进程理论上允许最多的线程数量是2048个, 实际当中要少得多才行. 有人说可以用WINDOWS的IOCP通信模型解决,诚然!但IOCP编程过于复杂. 有人说,可以

TCP长连接与短连接的区别

1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的 经典的三次握手示意图: 经典的四次握手关闭图: 2. TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接.client向server发送消息,se

TCP长连接和短连接

1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的 经典的三次握手示意图: 经典的四次握手关闭图: 2. TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接.client向server发送消息,se

【Netty4 简单项目实践】六、断掉未鉴权的TCP长连接--ChannelHandelContext中的定时器用法

在TCP长连接模式下,我们需要及时释放那些未授权的TCP链接,让系统运行得更稳健一些. 首先是connect上来的TCP报文需要设置一个存活期,通过在pipleline上设置超时处理器ReadTimeoutHandler ch.pipeline().addLast(new ReadTimeoutHandler(120)); 使得一个TCP在120秒内没有收到数据就断掉. 这样做的目的是让连接者必须发TCP报文才能维持连接. 下一步在业务层对ChannelHandlerContext进行鉴权.与H

TCP长连接和短连接的区别

当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次挥手,所以说每个连接的建立都是需要资源消耗和时间消耗的 示意图: 长连接: 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(不发生RST包和四次挥手).       连接→数据传输→保持连接

Http 和TCP的关系,TCP长连接和短连接有什么区别?

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种"短连接",要保持客户端程序的在线状态,需要不断地向服务器发起连接请求.HTTP 是应用层协议,TCP 是传输层协议(位于应用层之下). 一.长连接与短连接: 长连接:client方与server方先建立连接,连接建立后不断开,然后再进行