非常坚持这一点,非常感谢您能提供的任何帮助!
我有两个程序,一个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