IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 【学习总结】游戏客户端可能需要知道的有关服务器消息分发的一些小知识 -> 正文阅读

[网络协议]【学习总结】游戏客户端可能需要知道的有关服务器消息分发的一些小知识

注:这些知识来源于我实习中的一些总结,由于需要遵守公司的保密协议,所以很多东西不会往深了讲,会关联网上的相关内容进行介绍。

作为游戏客户端,MVC游戏架构比较流行的当下,其实是需要去了解客户端如何与服务端交互,需要去了解消息是如何被分发传递下来的。

文中还会提及作为游戏客户端需要掌握的一些常见知识,不过这一部分我只会大致提及,具体的内容还是需要找到资料学习清楚

一、大致流程

大致流程如下:
1.服务器发送一个消息包,客户端底层的TCP或者UDP套接字接口去接受服务器传过来的消息
2.这些消息可能是C++消息,也可能是内嵌了Protobuf的消息。所以我们就需要去做一个解析,将这些消息提取出来
3.提取出来的消息一般需要加入消息队列(因为消息处理的速度是无法衡量的,用一个队列来管理可以保证消息分发的健壮性,同理,事件也可以参考这种模式)
4.由于现在很多的手游逻辑端都是用Lua写的,简单解析之后还不行,可能还需要一个配置文件来进一步的将这些消息转换成Lua可读的消息格式
5.在MVC架构下,通过管理各个模块的Manager进行派发
6.一般来说,我们可以使用轮询的方式去匹配消息对应的响应函数,而响应函数名字一般就是消息名字,这样只需要一次循环就可以调用到对应的所有响应方法
在这里插入图片描述

二、Socket套接字

2.1 概念

1.Socket用来描述IP地址和端口,是通信链的句柄,是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制
2.Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口
3.Socket是支持TCP/IP协议的网络通信的基本操作单元,包含了进行网络通信所必须的五种信息:链接所使用的协议;本地主机的IP地址;本地远程的协议端口;远地主机的IP地址以及远地进程的协议端口

2.2 链接过程

连接过程可以分为三步:
1.服务器监听:所谓服务器监听,是指服务器套接字并不定位具体的客户端套接字,而是处于等待链接的状态,实时监控网络状态
2.客户端请求:所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务端的套接字。为此,客户端的套接字必须首先描述它要连接的服务端的套接字,指出服务端套接字的地址和端口号,然后就向服务器套接字提出连接请求
3.连接确认:所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,就会相应客户端套接字的请求,建立一个新的线程,并把服务器套接字的描述发送给客户端。一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,接收其他客户端的套接字的连接请求

2.3 Scoket类型

1.流套接字(SOCK_STREAM):用于面向连接、可靠的数据传输服务。该服务将保证数据能偶实现无差错、无重复发送,并按照顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP协议。

2.数据报套接字(SOCK_DGRAM):数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失的情况,需要在程序中做相应的处理。

3.原始流套接字(SOCK_RAW):原始套接字与标准套接字的区别在于,原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据包套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接字

2.4套接字缓冲区

1.每个Socket被创建之后,都会分配两个缓冲区,输入缓冲区和输出缓冲区

2.Write/send方法并不立即向网络中传输数据,而是先将数据写入缓冲区中,再用TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以返回,不管他们有没有到达目标机器,也不会管他们何时被发送到网络,这些都是TCP协议负责的事情。同理read/recv函数也是如此,也是从缓冲区中读取数据,而不是直接从网络中获取

TIPS:
I/O缓冲区在每个TCP套接字中单独存在
I/O缓冲区在创建套接字时自动生成
即使关闭套接字也会继续传送输出缓冲区中遗留的数据
关闭套接字将丢失输入缓冲区的数据

2.5一般传输模型

在这里插入图片描述

1.数据首先由应用程序缓冲区复制到发送端的输出缓冲区,注意这个过程使用类似Write功能的函数完成的。另外,Write成功仅仅表示数据成功的由应用进程缓冲区复制到了输出缓冲区

2.然后内核协议栈将输出缓冲区中的数据发送到对端主机,注意这个过程不受应用程序的控制,而是发送端内核协议栈完成,其中包括滑动窗口、拥塞控制等功能

3.数据到达接收端主机的输入缓冲区,注意这个接收过程也不受程序控制,而是由接收端内核协议完成,其中包括发送ack确认等

4.数据由套接字接收缓冲区复制到接收端应用程序缓冲区,注意这个过程是由类似read等函数来完成

三、Porotobuf

在传输中,我们可能会使用这种高效的方法来进行消息传输,Protobuf的全名为Protocol Buffers,它是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可以用于通信协议,数据存储等,并且是一种高效灵活的方式,它具有以下几个特点:
1.语言无关、平台无关:即ProtoBuf支持Java,C++,Python等多种语言,支持多个平台
2.高效:即比XML更小(3-10倍)、更快(20-100倍数)、更简单
3.扩展性、兼容性好:可以更新数据结构而不影响和破坏原有的旧程序

在使用过程中,会涉及序列化和反序列化:
序列化:将特定语言的数据结构转换为字节流
反序列化:将字节流转换回特定语言的数据结构

注:protobuf消息虽然传输高效但是由于序列化和反序列化的存在会一定程度上占用CPU从而影响性能

四、关于登录服和逻辑服分开

现在的一部分手游采用的是开发和代理分开的方式。所以,有些代理的游戏就需要登录上代理平台才可以拿到正确的服务器。也就是当玩家登录时,账号和密码在另一个服务器上进行校验,校验成功之后返回真正的游戏服务器网关。
将登录服务器和游戏服务器分开有那么几个优点:
1.登录入口唯一:即上方所说的代理平台问题。如果是跨平台操作,只需要修改登录服务器的代码然后发布即可,其他服务器不需要做任何修改
2.减少耦合:登录服和逻辑服互相独立之后,登录服挂了不会影响正在游戏中的玩家,逻辑服挂了也不会影响到登录
3.部署灵活:人少的时候可以将两个服务器部署到一块,而人多的时候则可以分开以减轻服务器压力

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 08:11:23  更:2021-07-28 08:12:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:38:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码