如何让客户端为每个其他客户端创建一个套接字

我需要帮助思考客户连接并与所有其他客户进行通信的设计。 我认为每个客户端将同时需要一个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),并且因为第二个是相同的,所以不保留。

这听起来合理吗?

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

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

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

我是新的套接字,所以它可能是基本的,但任何想法这样做?

Map应该完成这项工作,其中String是远程客户端的主机名。

如果您需要旧条目到期等function,请查看Guava CacheBuilder类。 这将创建一个自定义映射,其中包含各种行为/function,可简化缓存的实现。 (在这种情况下是连接的缓存)