【问题标题】:How to have clients create a socket for every other client如何让客户端为每个其他客户端创建一个套接字
【发布时间】:2011-11-21 04:27:22
【问题描述】:

我需要帮助来构思一个客户可以与所有其他客户联系和交流的设计。我认为每个客户端同时需要一个 ServerSocket 来侦听来自其他客户端的传入连接,以及一个用于启动与其他客户端的连接的 Socket。

我在 localhost 上进行测试,所以如果我使用端口号来跟踪连接,我会遇到这种情况:

Socket A (OS assigned port: a) initiates connection with ServerSocket B (known port: 2222)
Both clients record that connection (a, 2222) is made
Socket B (OS assigned port: b) initiates connection with ServerSocket A (known port: 1111)
Both clients record that connection (b, 1111) is made

我们应该每对客户端有 1 个连接,所以上面是浪费的。这就是为什么我正在考虑自己设置本地端口的原因:场景将更改为连接(1111,2222)和(2222,1111),并且由于第二个相同,因此不会保留。

这听起来合理吗?

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    为什么要求客户端设置它的本地端口?客户端、服务器套接字的工作方式有点不同。

    基本上,当您有客户端相互交谈时,您得到的是,每个客户端都有一个传入端口(服务器套接字),它将侦听其他客户端。当客户端希望连接到不同的客户端时,它将始终使用此端口来发起请求。收到请求后,客户端将简单地接受连接并将其传递给处理逻辑(无论是线程还是 NBIO 类型的逻辑)。在这种情况下,您不必在任何地方定义本地端口。

    我认为您要解决的问题之一是,如果两个客户端之间已经建立了连接怎么办?在这种情况下,双方都知道与谁连接并且不会建立新的连接。在这种情况下,您正在考虑为双向双工通信实现自己的协议。

    【讨论】:

    • 鉴于您的帮助,我回去再次尝试。你提到的这个问题是我需要帮助的。所以我正在编辑问题并将其添加到上面
    • 我最终用作解决方案的“协议”是,在每次连接启动时,您还会发送一条包含客户端 ID 的消息。比我想要的要复杂一点,但到目前为止它正在工作,我很着急。
    【解决方案2】:

    我是套接字新手,所以它可能是基本的,但是有什么想法吗?

    Map<String, Socket> 应该可以完成这项工作,其中字符串是远程客户端的主机名。

    如果您需要旧条目过期等功能,请查看 Guava CacheBuilder 类。这将创建一个具有各种行为/功能的自定义地图,从而简化了缓存的实现。 (在这种情况下是连接缓存)

    【讨论】:

    • 现在我只是在 localhost 上进行测试。所以我可以使用类似的想法,但使用端口对吗?并且将某些客户端分配给某些端口,客户端必须在启动连接之前设置它的套接字本地端口。这听起来对吗?我可能有一个后续问题。
    猜你喜欢
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2022-08-05
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多