Java-Android应用接受本地但非远程TCP连接
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java-Android应用接受本地但非远程TCP连接,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2810字,纯文字阅读大概需要5分钟。
内容图文
![Java-Android应用接受本地但非远程TCP连接](/upload/InfoBanner/zyjiaocheng/657/5009399fbaf84c74a32b72ad1361cf51.jpg)
非常坚持这一点,非常感谢您能提供的任何帮助!
我有两个程序,一个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设备将与服务器建立数据连接.
内容总结
以上是互联网集市为您收集整理的Java-Android应用接受本地但非远程TCP连接全部内容,希望文章能够帮你解决Java-Android应用接受本地但非远程TCP连接所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。