跳转至

一 服务器架构

多个客户端:

  • 客户端A
  • 客户端B
  • 客户端C

网关服务器(既是客户端又是服务端)

发送到 - 网关服务器(用来转发消息):判断指令是A攻击B(战斗模块)

战斗服务器(可能不止战斗)

网关判断指令后再具体发送到 - 战斗服务器进行处理

二 网关服务器

1.服务器类型enum

2.单独新建的gateWay套接字

3.单独的ConnetServer、Accept和Receive逻辑

三 新定消息协议

3.1 客户端给网关

服务器编号:服务器类型的枚举

消息长度 服务器编号 打包的协议
2字节 1字节

MyGuid静态类

  • 哈希Set存已有id
  • 获取逻辑
    • 静态变量id,获取时自增
    • 超过uintMax,重新设为0
    • 循环遍历Set,重复则继续递增
    • 加入到Set中
    • 返回id

客户端GUID对象字典

id,对应客户端对象

3.2 网关给客户端

传消息就行了

消息长度 服务器编号 打包的协议
2字节 1字节
## 3.3 服务端给网关
不需要服务器编号了
消息长度 guid 打包的协议
2byte 4byte

3.3 网关给其他服务器的通信协议

已经在发送前指定服务端发送了,就不需要再加入发送

消息长度 guid 打包的协议
2byte 4byte

3.4 客户端给网关的通信协议规定

这里要去客户端重新写一下

消息长度 服务端编号 打包的协议
2byte 1byte

四 战斗服

  • 不需要心跳机制
  • 不需要网络事件

  • 战斗服接收到消息就直接处理,也不需要再update逐帧定量处理消息了

4.1 处理Send

需要根据guid进行处理:

4.2 Main连接

五 MainClass

  • 分配一个IP+端口 提供给战斗服务器连接
  • 分配一个IP+端口 提供给socket连接

六 UDP通讯

6.1 在GateWay创建UDPClient(Socket)

  • 一个负责客户端UDP通讯
  • 一个负责服务端UDP通讯 在Accept逻辑里,绑定IP的端口(可以和TCP的一致),创建监听对象。

6.2 UDP的Receive

客户端转发到服务端

  • 要创建一个IPEndPoint,用来记录发消息的客户端的IP和端口。
  • 使用一个byte数组存UDP数据报。不需要拆包了
  • 取第一字节的服务器地址,再存入GUID
  • 转发到服务端类型对应的服务端Socket去
  • 递归处理,继续receive客户端消息。

服务端转发到客户端

思路一样的,消息解析不同罢了