编程语言
首页 > 编程语言> > Java-Android应用接受本地但非远程TCP连接

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

作者:互联网

非常坚持这一点,非常感谢您能提供的任何帮助!

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

该程序可以在本地网络上完美运行,无论是我的android手机连接到本地服务器ip 192.168.1.103还是托管服务器的PC上的模拟器连接到10.0.2.2.

但是,当我移出本地Intranet之外时,我仍然可以在端口21上建立android-> server连接,但是尝试在端口1025上从服务器连接到电话超时.

我要说明的事情清单:

> Android仿真器已重定向端口1025
> Windows(Win 7服务器主机)防火墙已禁用,其他已知防火墙已禁用
>传入的连接侦听器不在主线程上(SDK 2.1,因此无关紧要)
>路由器端口21和1025正在转发

测试列表及其结果:

>从本地网络上的模拟器/ Android手机/远程网络上的Android手机连接到服务器的公共IP(存在路由器)-无法建立服务器->电话连接
>移除路由器并从仿真器或远程Android手机连接-无法建立服务器->手机连接
>从模拟器连接到10.0.2.2,路由器是否存在-成功
>从本地网络上的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:连接被拒绝:connect.在此之前,客户端的LogCat显示侦听端口1025和服务器上的连接正在连接到/my.ip.he.re:1025

感谢您的指导!

解决方法:

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

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

标签:sockets,tcp,network-programming,java,android
来源: https://codeday.me/bug/20191127/2076715.html