2011-09-04 140 views
0
I am implementing a SocketServer for an Android device. 

The device I am using is Samsung G2 I9100. 
1. The device is connected to LAN through WiFi 
2. The IP returned to the device using 'NetworkInterface.getNetworkInterfaces()' & friends is 192.168.2.9 
3. The server implementation is as follows: 
    java.net.Socket socClient; 
    m_socServer = new java.net.ServerSocket(5050); 
    m_socServer.setSoTimeout(0); 
    socClient = m_socServer.accept(); 
4. Connection is accepted When using a local thread to connect eiather to 127.0.0.1:5050 or to192.168.2.9:5050 
5. when trying to connect using eg. telnet @ Win7 'm_socServer.accept()' keeps on blocking and the connection timesout on the Win7 telnet session. 
6. I have set the 'android.permission.INTERNET' permission. 

Why does inproc connection attempts succeed while LAN connection attentps fail? 

Any help will be appreciated. 

~Nadav 
+0

檢查您的防火牆設置。 – javment

回答

2

幾件事情要檢查:

1),你可以從你的WIN7箱ping到Android設備 - 也就是說,它們是相同的WiFi網絡上它願意路由數據包。 ping 192.168.2.9 應該工作。

2)您在Windows上使用telnet命令的一種形式是接受自定義端口5050而不是標準端口。 telnet 192.168.2.9 5050 應該工作,但如果有任何疑問,您可以嘗試抓取netcat或膩子的副本來代替telnet。

3)該流量實際上正在生成 - 在win7框中運行類似tcpdump的工具,或者如果可用(或者您有root用戶並且可以添加它)電話,並且看到有連接嘗試5050端口。

4)正常情況下我也建議你用netstat -n在手機上確認你是在端口5050監聽 - 似乎你在程序測試已經做到了,但它不會傷害是當然。您還可以查看netcat是否安裝在手機上(如'nc'),並使用adb命令行中的netcat進行本地連接嘗試,這不是您的程序測試本身,但這應該沒關係。

5)您也可以嘗試不同的端口

6)確保有一個在WIN7箱阻擋沒有防火牆出站交通

7)確保有一個在無線網絡沒有防火牆或子網分離路由器阻止您正在使用的端口上的客戶端之間的流量,或有線以太網端口(如果是win7盒的位置)和WiFi客戶端之間的流量。你的電話的IP地址是192.168,這有點可疑。 .x - 這可能意味着您的wifi將作爲與有線以太網分開的子網運行。

8)使用前向亞行端口

9)嘗試別人的程序,它在手機上類似的東西,也許是一個SSH服務器或Web服務器,願意在一個沒有特權的更高版本上運行的模擬器試試你的計劃端口爲了不需要root。

+0

感謝您的詳細回覆,所有LAN機器都是192.168.2。*家族,同一個WiFi網絡的另一臺筆記本電腦部件可以訪問,正如你所建議的,我已經在設備上執行了netstat -n,這顯示服務器正在偵聽tcp6,我正在使用tcp4連接(tcp6 0 ::: 5050 ::: * LISTEN),Q現在是我如何強制服務器同時升級到v4和v6 IP? – NadavRub

+0

只要按照建議在仿真器上測試端口轉發,並在仿真器上接受連接...考慮到這一點,可能會導致我的Galaxy S2 I9100上的連接嘗試失敗? (.accept()永遠不會返回)?!?!?!?! – NadavRub

+0

也許看看如果在Galaxy上adb端口轉發工作,哪裏的wifi沒有?但是,ipv6的東西可能是關鍵 - 你可能需要使用setSocketFactory(),並指向你重寫create()來指定AF_INET以顯式獲取ipv4的地方。在ServerSocket()和ipv6上進行搜索會導致在各種平臺上發生類似問題的一些提示,其中一些jdk版本的提示可能正在改變。 –