TCP/UDP 服务器怎么实现 request handler?
本人只做过传统的 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 是当今的标准答案么?
最简单的可以用 length delimiter 来区分消息类型,tcp 需要额外做一下 framing ,然后回调处理即可。
网游不知道, 但我们的物联网私有 TCP 协议这边, 是服务器根据协议解析后, 根据不同的指令 RPC 调用不同的服务
在StackOverflow上,有人要打算收集个免费电子书的列表,结果很快就有人分享了一个列表。很不错,我就转过来了。原帖的地址在http://stackoverflow.co…
1 HOUR SOFTWARE – 很多的小工具集 .NET Memory Profiler – 可以找出.NET程序中的内存泄露问题,并找出可优化的内…
前面写过一篇“腾讯,竞争力 和 用户体验”批评了腾讯,于是在我的微博上和博客上收到了一些反对意见,基本上是说腾讯产品的用户体验做得很好,很方便,等等,还列举了N多的例子,以及说…