代码之家  ›  专栏  ›  技术社区  ›  Enno Shioji

使用1个插座进行双向通信-如何处理碰撞?

  •  2
  • Enno Shioji  · 技术社区  · 15 年前

    我有一个应用程序。由“经理”和“工人”组成。目前,工作人员总是启动连接,向管理器说一些事情,管理器将发送响应。

    由于经理和工人之间有很多通信,我正在考虑在这两者之间打开一个套接字并进行通信。我也希望从双方开始互动——让经理可以随时对员工说些什么。

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

    P.S.I计划将netty用于实际实施。

    5 回复  |  直到 15 年前
        1
  •  3
  •   S.Lott    15 年前

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

    简单的回答。不要。

    从现有协议中学习:拥有一个客户机和一个服务器。事情会好起来的。worker可以是服务器,manager可以是客户机。经理可以提出许多要求。工作人员在请求到达时对其进行响应。

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

        2
  •  2
  •   biasedbit    15 年前

    我希望在服务器和客户机之间建立一个持久的双向通道。

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

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

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

    幸运的是,我刚刚写了一个关于这个精确问题的教程(包括示例项目)。用荨麻!:)

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

    注意,在这个解决方案中,服务器 没有 尝试连接到客户端。总是客户机连接到服务器。 如果每次想发送消息时都想打开一个套接字,那么应该重新考虑持久连接,因为它们避免了连接建立的开销,从而将数据传输速度提高了n倍。

        3
  •  1
  •   Keith Nicholas    15 年前

    我想你需要在插座上阅读……

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

        4
  •  1
  •   ppbitb    15 年前

    brunodecarvalho回复中提到的握手/网络教学的正确链接是 http://bruno.factor45.org/blag/2010/07/15/handshaking-tutorial-with-netty/
    我会在他的问题上加上这句话作为评论,但我没有这样做所需的最低声誉。

        5
  •  0
  •   Jonathan Rynd    15 年前

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

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