Language agnostic 使用1个插座进行双向通信-如何处理冲突?

Language agnostic 使用1个插座进行双向通信-如何处理冲突?,language-agnostic,network-programming,communication,netty,Language Agnostic,Network Programming,Communication,Netty,我有一个应用程序。这包括“经理”和“工人”。目前,工作人员总是启动连接,向经理说一些话,经理将发送响应 由于经理和工人之间有很多沟通,我正在考虑在他们之间打开一个插座来进行沟通。我也希望双方都能开始互动——让经理可以随时对员工说些什么 然而,对于如何处理“碰撞”,我有点困惑。比如说,经理决定对工人说些什么,同时工人决定对经理说些什么。会发生什么?这种情况应如何处理 p.S.我计划使用Netty进行实际实施 我想你需要仔细阅读一下插座 你不会真的遇到这样的问题……除了如何响应地处理接收和发送,通常

我有一个应用程序。这包括“经理”和“工人”。目前,工作人员总是启动连接,向经理说一些话,经理将发送响应

由于经理和工人之间有很多沟通,我正在考虑在他们之间打开一个插座来进行沟通。我也希望双方都能开始互动——让经理可以随时对员工说些什么

然而,对于如何处理“碰撞”,我有点困惑。比如说,经理决定对工人说些什么,同时工人决定对经理说些什么。会发生什么?这种情况应如何处理


p.S.我计划使用Netty进行实际实施

我想你需要仔细阅读一下插座

你不会真的遇到这样的问题……除了如何响应地处理接收和发送,通常这是通过处理你的通信来完成的。。。根据应用程序的不同,您可以采取多种方法来实现这一点。

“我也希望从双方开始互动,让经理可以随时向员工说些什么。”

答案很简单。不要

从现有协议中学习:拥有一个客户端和一个服务器。事情会很顺利的。Worker可以是服务器,Manager可以是客户端。经理可以提出许多要求。当请求到达时,工作人员响应请求


点对点可能很复杂,没有真正的复杂性价值。

我会选择服务器和客户端之间的持久双向通道

如果您只有一台服务器和一台客户端,那么就不会有冲突问题。。。如果服务器接受连接,它就知道是客户端,反之亦然。两者都可以在同一个套接字上读写

现在,如果您有多个客户端,并且您的服务器需要专门向客户端X发送请求,那么您需要握手

当客户端启动时,它将连接到服务器。建立此连接后,客户端将自己标识为客户端X(握手消息)。服务器现在知道它有一个向客户机X打开的套接字,每次需要向客户机X发送消息时,它都会重用该套接字

幸运的是,我刚刚就这个精确的问题编写了一个教程(包括示例项目)。使用Netty!:)

以下是链接:

请注意,在此解决方案中,服务器不会尝试连接到客户端。连接到服务器的总是客户机。
如果您想在每次发送消息时打开一个套接字,您应该重新考虑持久连接,因为它们可以避免建立连接的开销,从而将数据传输速率提高N倍。

brunodecarvalho的回复中提到的握手/Netty教程的正确链接是

我想将此作为对他的问题的评论,但我没有这样做所需的最低声誉。

如果你想重新发明轮子,不想使用中间件


设计您的协议,使另一个对等方对您的请求的回答始终易于与来自另一个对等方的请求区分开来。然后,仔细选择网络I/O策略。负责从套接字读取的任何代码都必须首先确定传入数据是对发送的数据的响应,还是来自对等方的新请求(查看数据头,以及您最近是否发出了请求)。此外,您还需要保持适当的排队,以便在您发送对对等方请求的响应时,它与您发出的新请求正确分开。

我明白了。但是,在客户端和服务器都需要启动通信的情况下,我们应该如何处理呢?@zweisteinen:首先,不要允许客户端和服务器启动通信。客户发起;服务器是被动的。这会导致服务器保存东西,直到客户机请求为止。如果你认为你想要“实时”,你有一个非常复杂的问题,需要一个合适的中间件来处理消息队列。谢谢你的建议!现在,客户机必须定期轮询服务器(反之亦然)。您认为在这种情况下,引入消息队列是合理的(以避免定期轮询)?@Zwei Steinen:引入消息队列不是“合理的”。它是“必不可少的”,它是“最佳实践”,它是“标准解决方案”。加油,哇!谢谢这真是太棒了:)