各位朋友,问题较长,请耐心看我来详细描述一下:
服务端是一个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地址的问题。那我就彻底费解了。
还请各位好心的有经验的朋友们帮我参考一下,到底如何解决这个问题,谢谢大家
因为现在已经没有路由器所以应该不用端口转发,之前用路由器的时候也试过端口转发,是不行的,后来直接把路由器撤了。
没有人么~~~
你需要设定proxy,做法是加jvm参数
-DsocksProxyHost=xxxx -DsocksProxyPort=yy
详细请参考:
http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html
从ADSL来验证这个功能很容易出问题,因为ADSL可能会对一些数据中间做了处理,你这么来验证:
1.把serverSocker的端口设置为80,因为ADSL服务商通常不会对80端口做过滤
2.手机通过浏览器可以访问应用,正好说明80端口是没有问题的。
3.不要发送数据,手机就connnect一下服务器的端口,如果能够connect上,说明ip和端口没问题,问题可能出现在adsl服务商
做了一些处理。
可以通过telnet ip 端口 测试 IP和端口是否正常,
还可以使用wireshark等抓包工具在服务器上抓包,查看tcp协议到底客户端连接是否来过,从而判断问题是出在服务端还是客户端。
哈,我看错了。ok,你应该用setSoTimeout(30000)设一个更长的 SO_TIMEOUT ,我猜可能由于ADSL不是特别稳定,所以连接时间会比较长.