作为学习练习,我正在设计一个跨平台消息服务。我以前编写过基于套接字的服务器,但始终是“客户端-轮询-服务器”设计,如 Web 服务器。我希望能够针对移动平台,并且我了解到轮询会耗尽电池电量,所以我想推送通知。
服务器将基于 TCP,用 C++ 编写。我无法理解的是如何管理设计的双向特性。我需要一个客户端能够像往常一样向服务器发送数据包,而且还能监听数据包。我该如何缓解这样的情况,例如,当服务器试图向客户端发送数据时客户端正在发送数据,或者它被阻止监听数据但随后需要发送一些东西?
例如,考虑以下粗略的图表:
因此,假设客户端 A 正在发送一大块数据(箭头 1)。发生这种情况时,客户端 B 发送一条消息(箭头 2),这会导致服务器尝试将数据发送回客户端 A(箭头 3),但客户端 A 尚未完成发送箭头 1。在这种情况下会发生什么?我应该在每个客户端上设置 2 个单独的端口,一个用于入站,一个用于出站吗?我是否需要跟踪每个连接的状态?
或者是否有更好的方法来解决这个问题?
最佳答案
一个套接字端口本质上是双向的。要或多或少地同时处理入站和出站流量,您需要使用非阻塞套接字。
关于c++ - TCP推拉套接字服务器设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27622066/