【问题标题】:Socket connection from PC to device fails从 PC 到设备的套接字连接失败
【发布时间】:2018-01-18 14:37:01
【问题描述】:

我正在为客户端-服务器应用程序使用套接字(即客户端发送数据,服务器接收数据)。我的代码如下。当我在平板电脑上的 Android 5.1 应用程序中使用客户端并在 Windows 7 PC 上的 Java 应用程序中使用服务器时,它运行良好(即平板电脑可以向 PC 发送数据)。但是,当我尝试在平板电脑上使用 Android 5.1 应用程序上的服务器代码和 PC 上的客户端代码(即从 PC 向平板电脑发送数据)时,无法建立连接并且出现错误:

java.net.ConnectException:连接超时:连接

平板电脑和电脑在同一个网络中。

怎么了?

服务器:

ServerSocket ss = new ServerSocket(13005);
Socket socket = ss.accept();
ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));

客户:

socket = new Socket();
socket.connect(new InetSocketAddress("10.2.130.125", 13005));
oos = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));

编辑:

我现在已经执行了netstat -nap。输出如下(我稍微改变了外国地址)。 13005好像没用过。

Proto Recv-Q Send-Q Local Address          Foreign Address        State
 tcp     417      0 10.2.130.125:36844     xxx.xxx.23.74:443      CLOSE_WAIT
 tcp     417      0 10.2.130.125:35996     xxx.xxx.23.110:443     CLOSE_WAIT
tcp6       1      0 ::ffff:10.2.130.125:44994 ::ffff:xxx.xx.205.170:443 CLOSE_WA
IT
tcp6       0      0 ::ffff:10.2.130.125:43995 ::ffff:xx.xx.119.188:5228 ESTABL
ISHED
tcp6       1      0 ::ffff:10.2.130.125:42353 ::ffff:xx.xx.23.110:80 CLOSE_WAI
T
tcp6       1      0 ::ffff:10.2.130.125:35722 ::ffff:xx.xx.205.170:443 CLOSE_WA
IT
tcp6       1      0 ::ffff:10.2.130.125:48101 ::ffff:xx.xx.205.110:443 CLOSE_WA
IT

我也执行了nmap -sS -Pn -p- 10.2.130.125。输出是:

Starting Nmap 7.60 ( https://nmap.org ) at 2018-01-18 16:10 W. Europe Standard T
ime
Nmap scan report for public-docking-cx-0635.ethz.ch (10.2.130.125)
Host is up (0.059s latency).
Not shown: 65534 filtered ports
PORT   STATE  SERVICE
22/tcp closed ssh

Nmap done: 1 IP address (1 host up) scanned in 159.90 seconds

这是来自客户端的堆栈跟踪。这只是一个超时异常。从服务器我没有得到任何异常。

java.net.SocketTimeoutException: connect timed out
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at inf.ethz.ch.streaming.server.main.Main$1.run(Main.java:164)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 你确定安卓平板的端口是开放的吗?
  • 您将需要某种形式的检查,例如 telnet,以查看端口是否实际打开。 IP 地址是否正确?
  • @f1sh ip地址是正确的,我从设置->关于平板电脑->状态->ip地址。这是我设备的网络地址。
  • @SantiagoSalem Acutally,我不知道我的平板电脑上的端口是否打开。我如何检查那个或我可以使用哪个端口?
  • @f1sh 我现在使用了telnet,结果发现端口没有打开(telnet 说它无法打开与主机的连接)。

标签: java android sockets serversocket android-networking


【解决方案1】:

可能正在使用端口 13005,可能最后一个连接没有关闭。

通过 USB 连接您的设备。然后转到您拥有adb 的文件夹并运行以下命令:

  1. adb shell
  2. netstat -nap

这将向您显示 android 设备中的所有活动端口。您将能够检查是否正在使用端口 13005。

如果您有很多连接,那么最好将 grep 应用于第 2 步。

  1. netstat -na |grep 13005

然后尝试使用另一个端口,例如5001。如果端口不受限制并且空闲,您应该可以连接。

【讨论】:

  • 非常感谢。请在原始帖子中查看我的编辑。 13005 好像没用过,5001 也不行。
  • 对不起,你是对的。客户端和服务器应该只是交换,但在我的实际代码中,我有正确的原因。
  • @machinery 并尝试使用 49152 和 65535 范围内的端口?你的代码似乎没问题。它应该是别的东西。您是否在清单文件中设置了互联网权限?
  • 是的,我已经在清单文件中设置了互联网权限。您提到的端口无法正常工作。
【解决方案2】:

您确定该端口可从外部使用吗? 您必须在路由器配置中打开端口。

【讨论】:

  • 我不确定该端口是否可以从外部使用。当我从我的平板电脑和我的电脑建立套接字连接时,我在我的电脑上使用了相同的端口,这很有效。所以我认为路由器不是问题。
  • 我现在尝试了 telnet 10.2.130.125 13005 并且无法连接。如何在 Android 中打开此端口或其他应使用的端口?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 2014-10-15
  • 2019-01-03
  • 2012-04-16
  • 1970-01-01
  • 2018-01-06
相关资源
最近更新 更多