我首先编写了一个示例 Java 服务器和 Android 客户端。我想跟踪登录到服务器的客户端。在套接字对象中,每个 Android 客户端都有一个唯一的端口号和连接的套接字 IP 地址。因此,这些是相互识别客户的选项。
我决定不使用每个客户端套接字的端口号,因为为两个 Android 客户端随机选择的端口号可能是相同数字的可能性很小。机会很小,但有可能。
相反,我决定使用 IP 套接字地址,它是每个客户端套接字中包含的另一串信息。好主意,对吧?没那么快。
要使用的功能是:
在服务器
socket.getRemoteSocketAddress()
并在客户端
socket.getLocalSocketAddress()
但是当我使用这些方法时,返回的地址是不一样的。
如果我在客户端的套接字对象上使用 getLocaSocketlAddress() 并将其作为字符串发送到服务器,那么稍后我必须在服务器的套接字连接上使用 getRemoteSocketAddress() 并查看它是否与我收到的地址相同客户端作为字符串。这样做是为了识别我从哪个客户端接收到消息。这两个地址不匹配,因为它们应该是。
例如,客户端通过调用getLocalSocketAddress()
客户端中的套接字对象来获取套接字地址------->将地址作为消息中的字符串发送到服务器---->服务器获取消息并调用getRemoteSocketAddress()
套接字以仅选择要发送的客户端回消息。不是所有其他客户。
服务器将所有连接的客户端的套接字存储在一个 ArrayList 中。
在客户端的套接字上使用getLocalSocketAddress()
返回例如XXX.XXX.11.17并且如果我getRemoteSocketAddress()
在服务器端的套接字中使用我得到XXX.XXX.0.13,这是一团糟,但是如果我使用端口号信息完美匹配getLocalPort()
在客户端和getPort()
服务器中。
所以有可能我可以使用客户端端口号来可靠地识别向哪个客户端发送消息。
这些方法有什么问题getLocalSocketAddress()
还是坏了?还有另一种方法可以识别哪个客户端已连接到服务器?
在服务器端,Java swing 桌面应用程序
// desktop connected to the internet by eathernet cable
socket = serversocket.accept();
System.out.println("SOCKET ADDRESS: "
+ socket.getRemoteSocketAddress().toString());
在客户端,
// Android tablet connected to internet by wifi
public void run() {
socket = new Socket(InetAddress.getByName(serverIP), 6789);
socketAddress = (socket.getLocalSocketAddress().toString());
Log.i(TAG, "SOCKET ADDRESS: " + socketAddress);