【发布时间】:2014-12-23 14:10:58
【问题描述】:
我正在设计一个跨平台消息服务作为学习练习。我以前编写过基于套接字的服务器,但始终是“客户端-轮询-服务器”设计,例如 Web 服务器。我希望能够以移动平台为目标,并且我读到轮询会消耗电池电量,所以我想做推送通知。
服务器将基于 TCP,用 C++ 编写。我难以理解的是如何管理设计的双向性质。我需要一个客户端能够像往常一样向服务器发送数据包,但也可以监听数据包。如何缓解以下情况,例如,客户端在服务器尝试向其发送数据时正在发送数据,或者它被阻止侦听数据但随后需要发送一些东西?
例如,考虑以下粗略的图表:
因此,假设客户端 A 正在发送数据块(箭头 1)。发生这种情况时,客户端 B 发送一条消息(箭头 2),这导致服务器尝试将数据发送回客户端 A(箭头 3),但客户端 A 尚未完成发送箭头 1。在这种情况下会发生什么?我应该在每个客户端上设置 2 个单独的端口,一个用于入站,一个用于出站吗?我需要跟踪每个连接的状态吗?
或者有更好的方法吗?
【问题讨论】:
-
tcp 连接是双向的。一旦你有一个连接 aserver 和 serverb,两个连接的任一端都可以向另一端发送一个数据包。更重要的决定是如何构建/格式化您的数据,以便您可以识别每个数据包的含义。
-
不要使用术语“数据包”(网络层的东西)来指代应用层消息。只会造成混乱。
-
@MarcB 我知道你可以在 TCP 连接上发送和接收数据,但是你可以同时做吗?
-
是的,您可以同时进行。