2015-02-06 46 views
0

我正在爲Android製作聊天應用程序,目前正在使用2個仿真器和通過USB連接的手機進行測試。 在過去的24小時內,我還沒有能夠獲得一個Socket來連接ServerSocket。每臺主機都使用ServerSocket爲了通過其客戶端套接字來監聽其他主機的「談話」。ServerSocket正在使用IP/::

對於這兩個仿真器,代碼打印出來的以下2行: The server socket is using ip: /::

serverSocket = new ServerSocket(portNo); 
Log.i("MY_TAG", "The server socket is using ip: " + serverSocket.getInetAddress()); 

使用下面的代碼行,我得到一個ConnectionException說,它不能連接到指定的IP和端口,該連接超時:

socket = new Socket(addr, portNo); 

我獲取IP的方式是通過查詢約每20秒的服務器,並在一個PHP腳本,我用$_SERVER['REMOTE_ADDR']這確實是我回IP地址。

當使用手機發送消息給模擬器,我得到一個稍微不同的錯誤。和仿真器一樣,我得到一個ConnectionException,除了它還說「連接被拒絕」。

當把從模擬器到手機的消息,我得到一個ConnectionException由於超時。

手機的ServerSocket的使用IP 0.0.0.0這是我所知道的是很好,因爲這意味着它只是偵聽所有接口。

在所有情況下,服務器套接字的accept()方法都不會返回。

使用netstat -an(我正在使用Windows作爲我的操作系統),我沒有看到我的ServerSockets在輸出中列出的任何端口。

使用telnet,試圖在仿真器(使用PHP的$_SERVER['REMOTE_ADDR']要獲取IP)時,我得到一個連接被拒絕的消息。
當在手機的IP和偵聽端口上使用telnet時,我會收到連接超時。

這就是說,請幫我弄清楚如何讓這些插座連接。

+0

是您的Web服務運行? – 2015-02-06 09:29:44

+0

是的。我可以看到我的數據庫中的每個用戶都會更新IP地址和端口。大約每20秒鐘一次,用戶使用他們的IP和端口更新這個數據庫,同時檢索他們所有朋友的IP和端口。 – Kacy 2015-02-06 09:39:41

+0

'每臺主機都使用一個ServerSocket來通過客戶端套接字來監聽其他主機的「通話」。對不起,我不明白你的設置。什麼是'主人'。對我來說,使用多於一個的服務器端口看起來不是一個好主意。你爲什麼需要這個?重新思考你的設計。 – greenapps 2015-02-06 11:13:31

回答

0

簡單的答案是什麼,我試圖做是不可能的(至少在沒有通過一些箍跳躍)。問題是兩臺主機都在NAT路由器後面。 NAT路由器工作的方式是當傳入的消息到達他們時,他們查看消息中的端口號,然後將其轉換爲與位於隱藏在其後的本地網絡中的某個主機相對應的內部IP和端口號。這是使用稱爲NAT轉換表的東西完成的。我的設計的問題在於,爲了將來自世界的消息傳遞給NAT,我向NAT提供了內部端口號,當我真的應該給它發送消息發出時NAT分配給主機內部端口的任何端口號。 這裏有一個畫面來形容我在說什麼(由Alex C. Snoeren,加州大學聖地亞哥分校的真棒聯網教授的演講稿所): enter image description here

我的解決方案將是重新設計我在做什麼由具有單個ServerSocket一直監聽某個虛擬主機上的新連接。