我有一个应用程序。由“经理”和“工人”组成。目前,工作人员总是发起连接,向经理说些什么,经理会发送回复。
由于Manager和Worker之间有很多通信,我正在考虑在两者之间打开一个套接字并进行通信。我也希望能够启动双方的互动 - 让经理能够随时向工人说些什么。
然而,我对如何处理“碰撞”感到困惑。比如说,经理决定向工人说些什么,同时工人决定向经理说些什么。会发生什么?应如何处理这种情况?
P.S。我计划使用Netty进行实际实施。
答案 0 :(得分:3)
“我也希望能够启动双方的互动 - 让经理能够随时向工人说些什么。”
简单的回答。别。
了解现有协议:拥有客户端和服务器。事情会好起来的。 Worker可以是服务器,Manager可以是客户端。经理可以提出大量请求。工作人员在到达时对请求做出响应。
点对点可能很复杂,对复杂性没有实际价值。
答案 1 :(得分:2)
我会在服务器和客户端之间寻找持久的双向通道。
如果您只有一个服务器和一个客户端,则没有冲突问题...如果服务器接受连接,它就知道它是客户端反之亦然。两者都可以在同一个套接字上读写。
现在,如果您有多个客户端并且您的服务器需要专门向客户端X发送请求,那么您需要握手!
当客户端启动时,它会连接到服务器。建立此连接后,客户端将自己标识为客户端X(握手消息)。服务器现在知道它有一个对客户端X开放的套接字,每次需要向客户端X发送消息时,它都会重用该套接字。
幸运的是,我刚刚在这个精确的问题上写了一个教程(包括示例项目)。使用Netty! :)
以下是链接:http://bruno.linker45.eu/2010/07/15/handshaking-tutorial-with-netty/
请注意,在此解决方案中,服务器不会尝试连接到客户端。它始终是连接到服务器的客户端。 如果您每次想要发送消息时都考虑打开套接字,则应重新考虑持久连接,因为它们可以避免建立连接的开销,从而将数据传输速率提高N倍。
答案 2 :(得分:1)
我认为你需要阅读套接字......
你并没有真正得到这些问题....除了如何响应处理接收和发送之外,通常这是通过线程化你的通信来完成的......根据应用程序你可以采取多种方法对此。
答案 3 :(得分:1)
brunodecarvalho回复中提到的Handshake / Netty教程的正确链接是http://bruno.factor45.org/blag/2010/07/15/handshaking-tutorial-with-netty/
我会将此作为对他的问题的评论添加,但我没有这样做的最低要求。
答案 4 :(得分:0)
如果您想重新发明轮子并且不想使用中间件......
设计协议,以便其他对等方对您的请求的回答始终可以轻松地与来自其他对等方的请求区分开来。然后,仔细选择您的网络I / O策略。无论负责从套接字读取的代码必须首先确定传入的数据是否是对发送的数据的响应,或者是否是来自对等方的新请求(查看数据的标头,以及您是否已发出请求)最近)。此外,您需要保持正确的排队,以便在您向对等方的请求发送响应时,它与您发出的新请求正确分开。