我第一次写了一个示例Java服务器和Android客户端。我想跟踪登录到服务器的客户端。在套接字对象中,每个Android客户端将有一个唯一的端口号和套接字IP地址连接。所以这些是彼此识别客户的选项。getLocalSocketAddress()和getRemoteSocketAddress()不返回正确的值
我决定不使用每个客户端套接字的端口号,因为两个Android客户端随机选择的端口号可能是相同的数字的可能性很小。一个小机会,但可能。
相反,我决定使用IP套接字地址,这是另一个包含在每个客户端套接字中的信息。好主意,对吧?没那么快。
要使用的功能是:
服务器socket.getRemoteSocketAddress()
,并在客户端
socket.getLocalSocketAddress()
然而,当我使用这些方法时,返回的地址是不一样的。
如果我在客户端的套接字对象上使用getLocaSocketlAddress(),并将它作为字符串发送到服务器,那么稍后我必须在服务器的套接字连接上使用getRemoteSocketAddress(),并查看它是否如此我从客户端收到的地址作为字符串。这样做是为了确定我从哪个客户端收到消息。这两个地址不符合他们应有的要求。
实施例,客户机通过在客户端套接字对象调用getLocalSocketAddress()
获得套接字地址------->发送地址作为字符串消息发送到服务器----->服务器获取信息以及套接字调用getRemoteSocketAddress()
到只选择那个客户端发回消息。并非所有其他客户。
服务器存储连接在ArrayList中的所有客户端套接字。
使用插座例如XXX.XXX.11.17客户端回报上getLocalSocketAddress()
,如果我在插座上的服务器端,我得到XXX.XXX.0.13使用getRemoteSocketAddress()
,这是搞砸了,但是,如果我在客户端使用getLocalPort()
,而在服务器中使用getPort()
,则端口号信息会完美匹配。
因此,我可以使用客户端端口号作为可靠地识别哪个客户端发送消息的方式。
getLocalSocketAddress()
方法有什么问题或者它们是否被破坏?还有另一种方法可以确定哪个客户端连接到服务器?使用IP地址
,的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);
顺便说一句,你不介意分享你用它来测试它的网络设置更多的细节? – 2013-02-28 11:27:28