2 u010416820 u010416820 于 2014.12.02 10:01 提问

Java Socket 外网连不上但是内网可以。 ADSL提供网络,没有路由器

各位朋友,问题较长,请耐心看我来详细描述一下:
服务端是一个JavaWEB的网站项目,里面有ServerSocket,用来接受客户端数据。客户端是Android程序,里面启动Socket后会循环发送数据。我在运行的时候用的是家里的电脑和自己的手机,如果都在一个局域网里(手机用WIFI)数据传输没有问题,如果切换到外网后(ADSL出来的网线连接电脑,手机用3G)用我电脑cmd命令ipconfig查到的PPP ip输入到手机浏览器中可以访问JavaWEB的网站,也就是说可以ping通这个ip地址。但是用手机发送socket数据到这个ip时,服务端会在accept()一直阻塞。我也想过可能是端口没有开放,但是如果我把Android端的socket不进行循环发送数据时(只发送一条数据)过20秒左右服务端会报错 java.net.SocketException: Connection reset,报错的地方是服务端接收到客户端数据后进行读取操作的一步(下面代码最后一行会报错)
Socket s = new ServerSocket(7777).accept();
InputStream in = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String response = br.readLine();
用DEBUG查看会发现报错前s中有客户端的信息,比如客户端的ip地址和发送端口等。这是不是也可以证明服务器的端口已经开放。如果排出了端口和ip地址的问题。那我就彻底费解了。
还请各位好心的有经验的朋友们帮我参考一下,到底如何解决这个问题,谢谢大家
因为现在已经没有路由器所以应该不用端口转发,之前用路由器的时候也试过端口转发,是不行的,后来直接把路由器撤了。

5个回答

wgw335363240
wgw335363240   2014.12.02 17:28

从ADSL来验证这个功能很容易出问题,因为ADSL可能会对一些数据中间做了处理,你这么来验证:
1.把serverSocker的端口设置为80,因为ADSL服务商通常不会对80端口做过滤
2.手机通过浏览器可以访问应用,正好说明80端口是没有问题的。
3.不要发送数据,手机就connnect一下服务器的端口,如果能够connect上,说明ip和端口没问题,问题可能出现在adsl服务商
做了一些处理。

mmzmagic
mmzmagic   2014.12.02 21:55

可以通过telnet ip 端口 测试 IP和端口是否正常,
还可以使用wireshark等抓包工具在服务器上抓包,查看tcp协议到底客户端连接是否来过,从而判断问题是出在服务端还是客户端。

eagleyan
eagleyan   Rxr 2014.12.03 01:14

哈,我看错了。ok,你应该用setSoTimeout(30000)设一个更长的 SO_TIMEOUT ,我猜可能由于ADSL不是特别稳定,所以连接时间会比较长.

u010416820
u010416820   2014.12.02 11:03

没有人么~~~

eagleyan
eagleyan   Rxr 2014.12.02 12:49

你需要设定proxy,做法是加jvm参数
-DsocksProxyHost=xxxx -DsocksProxyPort=yy

详细请参考:

http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!