我有一个应用程序。由“经理”和“工人”组成。目前,工人始终启动连接,对经理说些什么,经理将发送响应。

由于经理和工人之间有很多交流,因此我考虑在两者之间打开插座并进行通信。我也希望从双方启动互动 - 使经理能够随时向工人说些什么。

但是,我对如何处理“碰撞”有些困惑。说,经理决定对工人说些什么,与此同时,工人决定对经理说些什么。会发生什么?应该如何处理这种情况?

PS I计划将Netty用于实际实施。

有帮助吗?

解决方案

“我也希望从双方发起互动 - 使经理能够随时向工人说些什么。”

简单的答案。不。

从现有协议中学习:拥有客户端和服务器。事情会很好地奏效。工人可以是服务器,经理可以是客户端。经理可以提出许多请求。工人回应他们到达的要求。

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

其他提示

我将在服务器和客户端之间使用持续的双向通道。

如果你只有 服务器和 客户端,然后没有碰撞问题...如果服务器接受连接,它知道它是客户端,反之亦然。两者都可以在同一插座上读写。

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

客户端启动时,它连接到服务器。建立此连接后,客户端将自己识别为客户端X(握手消息)。服务器现在知道它具有向客户端X开放的套接字,并且每次将消息发送给客户端X时,它都会重新使用该套接字。

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

这是链接: http://bruno.linker45.eu/2010/07/15/handshaking-tutorial-with-netty/

请注意,在此解决方案中,服务器 才不是 尝试连接到客户。连接到服务器的始终是客户端。如果您想每次要发送消息打开插座,则应重新考虑持久连接,因为它们避免了连接建立的开销,从而加快了数据传输率n倍。

我认为您需要在插座上阅读。

您并没有真正遇到这类问题。...除了如何响应地处理接收和发送外,通常这是通过线程进行通信来完成的...取决于应用程序,您可以采取多种方法。

Brunodecarvalho响应中提到的握手/Netty教程的正确链接是 http://bruno.factor45.org/blag/2010/07/15/handshaking-tutorial-with-netty/
我会在他的问题中将其添加为评论,但我没有最低要求的声誉。

如果您想重新发明轮子并且不想使用中间件...

设计您的协议,以使其他同行对您的请求的答案总是可以与其他同行的请求区分开。然后,仔细选择您的网络I/O策略。无论负责从插座读取的代码,必须首先确定传入数据是否是对发送的数据的响应,或者是否是同行的新请求(查看数据的标题,以及您是否发布了请求最近)。另外,您需要保持适当的排队,以便当您对同行请求发送响应时,它与您发出的新请求正确分开。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top