3

我正在使用 Java 桌面服务器和连接到它的多个 Android 客户端。在服务器端,我需要确定哪个客户端通过套接字 TCP/IP 向我发送了一条消息,并仅向该客户端发送响应,而不向其他客户端发送响应。

我会将客户端的所有套接字存储在一个 ArrayList 中。

首先,这是我尝试过的两种不起作用的方法;

-- 客户端的IP地址,通过在客户端调用socket.getLocalSocketAddress()和在服务器调用socket.getRemoteSocketAddress()来获取,但是它们永远不匹配。例如,我进入了客户端 XXX.XXX.11.17 和服务器 XXX.XXX.0.13,对于相同的连接,它们应该是相同的。

-- 端口号,通过在客户端调用 getLocalPort() 和在服务器中调用 getPort() 来获取,是的,这完美地工作并且数字匹配,所以我可以使用它,但是有可能随机选择的端口号在两个不同的客户端可能是相同的。不太可能但可能。所以这意味着不能保证它们是独一无二的。

我可以使用的替代方法是什么?

4

2 回答 2

3

我需要确定哪个客户端通过套接字 TCP/IP 向我发送了一条消息,并仅向该客户端发送响应,而不向其他客户端发送响应。

将其发送回您收到请求的同一个套接字。

如果您需要为客户永久识别,您可以使用Socket.getRemoteAddress().

于 2013-02-28T08:33:37.410 回答
1

客户端中的 getLocalSocketAddress() 和服务器中的 getRemoteSocketAddress() [...] 对于同一连接应该是相同的。

不,因为你不知道中间是什么。大多数移动提供商使用代理、NAT 等。移动设备认为它位于提供商提供的 LAN(10.0.0.x 或 192.168.xx 地址)上。多个客户端甚至有可能拥有相同的远程地址(从您的服务器上可以看到)。

话虽如此,如果服务器侦听一个 IP、端口和协议,您可以通过组合在一起的远程 IP 地址和端口来唯一地识别服务器应用程序中的客户端。此信息可从 获得socket.getRemoteSocketAddress(),其中返回的InetSocketAddress(在 Internet 套接字的情况下)包含远程 IP 和端口(分别为getAddress()getPort())。

但正如另一个答案所示,您实际上并不需要一种识别客户的方法。网络客户端由您接收数据套接字标识(套接字是两个节点之间的独占连接),因此只需将数据发送回您接收请求的套接字。

如果您确实需要有关已连接客户端的更多簿记数据,请将客户端套接字包装在包含附加信息的包装类中。

于 2013-02-28T08:25:10.640 回答