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

时间:2011-11-21 04:27:23

标签: java sockets

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

这听起来合理吗?

2 个答案:

答案 0 :(得分:1)

  

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

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

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

答案 1 :(得分:1)

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

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

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