gpt4 book ai didi

java - Android 应用程序接受本地但不接受远程 TCP 连接

转载 作者:可可西里 更新时间:2023-11-01 02:34:04 25 4
gpt4 key购买 nike

非常坚持这一点,所以我很感激你能提供的任何帮助!

我有两个程序,一个是Android 应用程序,一个是多路Java 服务器。 Android 应用程序首先建立到服务器(端口 21)的出站连接,然后接受来自服务器(端口 1025)的入站连接。为了保持一致性,无论建立连接的方向如何,我始终将 Android 应用程序称为客户端,将 Java 应用程序称为主机。

程序在本地网络上完美运行,我的 android 手机连接到我的本地服务器 ip 192.168.1.103 或托管服务器连接的 PC 上的模拟器到 10.0.2.2

但是,当我离开本地 Intranet 时,我仍然可以在端口 21 上建立 android-> 服务器连接,但是我在尝试从服务器连接到手机时超时 在端口 1025 上。

我正在核算的事项列表:

  1. Android 模拟器已重定向端口 1025
  2. Windows(Win 7 服务器主机)防火墙已禁用,其他已知防火墙已禁用
  3. 传入的连接监听器不在主线程上(SDK 2.1 所以应该无关紧要)
  4. 正在转发路由器端口 21 和 1025

测试列表及其结果:

  1. 从本地网络上的模拟器/android 手机/远程网络上的 android 手机连接到服务器的公共(public) ip(存在路由器)-无法建立服务器->手机连接
  2. 移除路由器并从模拟器或远程安卓手机连接 - 无法建立服务器->手机连接
  3. 从模拟器连接到 10.0.2.2,路由器是否存在 - 成功
  4. 从本地网络上的 android 手机连接到 192.168.1.103 - 成功

最后是一些代码,服务器的输出连接尝试(连接是在构造函数中创建的,因为在服务器收到入站连接时已经为该客户端创建了一个子线程)

OutputSocketServer(InetAddress inetAddress, int port, int count , LinkedBlockingQueue<Packet> outQueue) {
this.outQueue = outQueue;
SocketAddress sockaddr = new InetSocketAddress(inetAddress,port);

try {
outConnection = new Socket();
System.out.println("Connecting to " + sockaddr.toString());
outConnection.connect(sockaddr, timeout);
System.out.println("Connected to port " + outConnection.getPort() + " of " +outConnection.getInetAddress().toString() + " from local port " + outConnection.getLocalPort());
osw = new ObjectOutputStream(outConnection.getOutputStream());
} catch (IOException e) {
System.out.println("Output Socket Server: Could not establish outbound connection" + e.toString());
e.printStackTrace();
}
}

以及Android客户端连接接受码的相关部分

public void run() {
try {
System.out.println("Listening for connection on local port " + inSocket.getLocalPort());
this.inConnection = inSocket.accept();
System.out.println("Accepted connection on port " + inConnection.getPort() + " from ip " + inConnection.getInetAddress().toString());
isr = new ObjectInputStream(inConnection.getInputStream());
}
catch (Exception e) {
System.out.println("Inbound Socket Server: " + e.toString());
}
}

android 客户端的堆栈跟踪只是说 SocketTimeoutException:操作超时 和服务器 ConnectException:连接被拒绝:连接。在此之前,客户端的 LogCat 显示 Listening for connection on port 1025 和服务器 Connecting to/my.ip.he.re:1025

感谢您的指导!

最佳答案

大多数无线服务仅将不可路由的 RFC1918 地址分配给设备,并通过 NAT 路由“互联网”。这意味着您的设备可以进行出站连接 - 但您不能从外部(入站)连接到它。原因之一是缺少免费的 IPv4 地址空间。

由于您的帖子提到了端口 21:如果您需要 FTP,请使用被动模式。在此模式下,Android 设备将与服务器建立数据连接。

关于java - Android 应用程序接受本地但不接受远程 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12027790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com