12 Cooperate With Tcp Server
Jim edited this page 2021-06-15 14:26:56 +08:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

在使用 KCP时你可以用在你 TCP的基础上在登陆时服务端返回 UDP端口和密钥客户端通过 TCP收到以后向服务端的 UDP端口每隔一秒重复发送包含握手信息直到服务端返回成功或者失败。服务端通过 UDP传上来的密钥得知该客户端 sockaddr对应的 TCP连接这样就建立 TCP连接到 UDP连接的映射关系。为了保持连接和 NAT出口映射客户端一般需要每 60秒就发送一个 UDP心跳服务端收到后回复客户端再在这个 UDP连接的基础上增加调用 KCP的逻辑实现快速可靠传输这样一套 TCP/UDP两用的传输系统就建立了。

可以参考下述例子:

  1. 客户端链接tcp服务端为该tcp链接分配一个整数id作为标识。
  2. 登录后服务端给客户端发送udp握手信息包括自己的udp端口用户的tcp标识id32位随机数key
  3. 客户端给服务端udp地址发送握手信息把刚才服务端发过来的(id, key) 发送给服务端。
  4. 服务端确认udp握手并且记录该用户udp远端地址
  5. 以后客户端和服务端udp通信每个包都包含id, key
  6. 服务端用客户端发上来的idkey确认用户身份并对比远端地址confirm是一个合法用户。

注意:为了保持 NAT映射关系UDP需要每隔 60秒就向服务器 ping一次。同时为了防止出口地址改变NAT映射改变或者移动设备切换基站可以使用重连或者UDP重绑定但是在 3G,2G,EDGE下面出口改变TCP也就断了所以简单重连也没问题

客户端和原有的TCP连接对象稍微封装一下就得到一个类似

connection.send(channel, data, size)

的接口channel=0时使用原有tcp发送channel=1时使用kcp发送channel=2时使用裸的udp发送。三个channel同时工作适配不同情况。服务端接口也类似。

中国的网络情况比较特殊,会存在有些网络 UDP连接不上的情况因此都是先连接 TCP然后试图 UDPUDP不通的情况下退回 TCP也能正常游戏一旦 TCP断开则认为 UDP也断开了。