android tcp 远程控制,Java-Android应用接受本地但非远程TCP连接

博主遇到的问题是在本地网络外,Android应用可以成功从端口21向服务器发起连接,但服务器尝试从端口1025向Android设备建立连接时超时。已确认防火墙关闭,端口转发正确,且在本地网络内连接正常。问题可能在于NAT导致的入站连接限制。解决方案可能是使用FTP的被动模式或其他方法来允许服务器与设备间的双向通信。
摘要由CSDN通过智能技术生成

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

我有两个程序,一个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 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值