我第一次寫了一個示例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