本人只做过传统的 restful API web server,
客户端请求通过路由传给不同的 API handler ,实现各种功能,
如果是 TCP/UDP 服务器的情况下,要怎么实现这个路由给 handler 的功能呢?
举个例子,游戏服务器,
传统 restful 的情况下比如有一个查询人物等级的 api ,另有一个更新人物属性的 api
通过路由 api/level 和 api/stat 交由各自的 handler 处理
但在 tcp/udp 的情况下,似乎本来就不存在路由或者 handler 这个概念?那要怎么处理类似情况呢?

TCP/UDP 和 HTTP 就不在同一层,如果你要 TCP 服务器的话就要自己设计数据报格式,自己解析然后“路由”。

这就好比自己设计二进制游戏存档格式,不用 JSON/XML 但是又想用 jsonpath/xpath 来找数据一样

我先不说所谓的答案,尝试引导下你:你了解过 http 协议吗,或者说怎样的数据才能别识别撑 http ,要实现一个 http 路由依赖哪些东西?

rpc

TCP/UDP 是传输层协议,不关心你应用层怎么解析数据。自己定义

你的问题好比在问,不用 HTTP 怎么接发请求。当然自定义协议哇。

你说的这个 request handler ,传输层用得还是 TCP ,它只是应用层用的 http 协议 。你自己的服务器,并不是直接运行在 TCP/UDP 协议上的,它也需要有专门的应用层协议。你照着 http 协议,搞一个带路由功能的协议即可。单纯的协议可能很难,但是要是把协议跟你开发用的工具结合起来定义,应该会很简单。

不想折腾就上 rpc ,或者自研 rpc

TCP/UDP 只是传输层协议,真正在用的时候会定义应用层的协议。那么应用层协议就对应 http 协议了。类似应用层就可以解析出一些关键字段,然后根据路由跳转。
当然了,一般都是直接用 rpc 框架来实现这些。一般情况下,开发者压根不用管路由。

你买了一组乐高,你会让顺丰快递把你拆包搭建好给你么?
1.TCP 和 UDP 是传输协议,负责包裹是否有破损或丢包,UDP 丢包全部重新发,少了检查完整性所以效率比 TCP 高
2.request handler 属于 HTTP 协议,具体查看 HTTP 协议格式,里面带了 method ,path,header .......

这个是应用层要考虑的事情,TCP/UDP 就是一条公路,你把货物运到哪里完全由你自己决定。

tlv, 自己定协议处理

自己设计一套应用层协议就可以了。最简单的就是在包头增加一个 COMMAND 。

这个协议简单可以很简单,复杂也可以像 http 那么复杂。

最简单的一种协议大概是这个样子:

| 标识(约定一个固定长度,如 4B ) | Length(4B) | Command(4B) | Content ( xxxxx B )

写个接收逻辑,收到特定的标识后,读出整个指令(长度从 Length 中读取),然后根据 Command 转发给对应的方法处理即可。

之前做单片机做串口通信的时候,协议就是自己实现的,也没啥难度。代码量很少。

估计 servlet 都不知道,spring 基础也不合格,springmvc 的 dispatcherServlet 估计也不知道

一般最后再增加一个 校验码,对整个 Payload 进行一次异或 或 CRC32 之类的校验,避免传输错误。

重新发明 HTTP (

协议解析->协议 handler

Netty 使用 TLV 格式的数据包就很容易解决这个问题

黏包警察在此

protobuf

难道这就是没有网游开发经验但强行答题的样子?

grpc 是当今的标准答案么?

试试?kInteractiveProtocol 协议

最简单的可以用 length delimiter 来区分消息类型,tcp 需要额外做一下 framing ,然后回调处理即可。

网游不知道, 但我们的物联网私有 TCP 协议这边, 是服务器根据协议解析后, 根据不同的指令 RPC 调用不同的服务