Android应用程序接受本地但非远程TCP连接

时间:2012-08-19 15:46:45

标签: java android sockets tcp network-programming

非常坚持这个,所以我感谢你能给予的任何帮助!

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

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

然而,当我移出我的本地内部网时,我仍然可以在端口21上建立android->服务器连接但我在端口1025上尝试从服务器连接到手机

我要考虑的事项清单:

  1. Android模拟器重定向端口1025
  2. Windows(Win 7服务器主机)防火墙已禁用,其他已知防火墙已禁用
  3. 传入连接侦听器不在主线程上(SDK 2.1因此无关紧要)
  4. 正在转发路由器端口21和1025
  5. 测试列表及其结果:

    1. 从远程网络上的本地网络/安卓手机上的模拟器/安卓手机连接到服务器的公共IP(路由器存在) - 无法建立服务器 - >电话连接
    2. 删除路由器并从模拟器或远程Android手机连接 - 无法建立服务器 - >电话连接
    3. 从模拟器连接到10.0.2.2,路由器是否存在 - 成功
    4. 从本地网络上的Android手机连接到10.0.2.2 - 成功
    5. 最后是一些代码,服务器的输出连接尝试(连接是在构造函数中创建的,因为在服务器收到入站连接时已经创建了此客户端的子线程)

      192.168.1.103

      并且Android客户端连接的相关部分接受代码

      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()); } } 和服务器SocketTimeoutException: operation timed out。在此之前,客户的LogCat显示ConnectException: connection refused: connect和服务器Listening for connection on port 1025

      感谢任何指导!

1 个答案:

答案 0 :(得分:3)

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

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