2011-09-04 105 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版本的提示可能正在改变。 –