Java 尝试使用外部IP将我的Android客户端连接到我的计算机
我正在尝试制作一个服务器-客户机模型,其中一个java应用程序将成为服务器,一个android应用程序将在侦听端口(任意选择50000)中与我的服务器计算机建立套接字连接 android应用程序注册、登录、发出一些信息请求并发送一些响应。服务器程序监听一个或多个客户机并从MySQL数据库中获取一些信息,当客户机结束请求时,会打印一张他们购买的财务票据 几乎所有作品:Java 尝试使用外部IP将我的Android客户端连接到我的计算机,java,android,sockets,communication,serversocket,Java,Android,Sockets,Communication,Serversocket,我正在尝试制作一个服务器-客户机模型,其中一个java应用程序将成为服务器,一个android应用程序将在侦听端口(任意选择50000)中与我的服务器计算机建立套接字连接 android应用程序注册、登录、发出一些信息请求并发送一些响应。服务器程序监听一个或多个客户机并从MySQL数据库中获取一些信息,当客户机结束请求时,会打印一张他们购买的财务票据 几乎所有作品: 在我的路由器中配置了uPnP端口转发 我的java程序已打开并在正确的端口中侦听(端口50000正在侦听,在命令netstat中
- 在我的路由器中配置了uPnP端口转发
- 我的java程序已打开并在正确的端口中侦听(端口50000正在侦听,在命令netstat中)
- 我的外部IP在动态DNS主机中解析(我使用的网站没有IP),当我ping到我的主机时,会返回正确的外部IP
- 几乎在我的路由器“开心”的时候,一切都正常了李>
- 外部IP不变(本地IP不变)
- 端口保持可见(在许多port tester网站上进行了测试,我的程序也打印出有人在检查端口时尝试了连接)
- 我可以ping到我的主机并解析到正确的IP
- 如果android应用程序在同一个网络中,并且使用本地IP(我的电脑是192.168.1.8),它就可以连接
- telnet 192.168.1.8 50000件作品(本地主机)
- telnet 127.0.0.1 50000也可以工作(是否也是本地主机?)
- telnet localhost 50000也可以工作(显然是本地主机)
- 但是到外部ip和到路由器ip(192.168.1.1)不起作用,打印如下:“连接到123.123.123.123…无法打开到主机的连接,在端口50000上:连接失败。”
- 在外部ip上使用telnet时,如果不指定端口,则not works会打印上述内容
- (需要说明的是,当我的路由器“满意”所有telnet的工作时)
@Override
public void run()
{
try {
Start();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Inicio.Erro("Erro no Server:"+e.getMessage());
e.printStackTrace();
}
System.out.println("SocketServerThread Parou");
Inicio.LOG("Server Parou");
}
public void Start() throws InterruptedException
{
connect();
while(KeepWaiting)
{
WaitClient();
}
}
public void connect()
{
try {
serverSocket =new ServerSocket(50000);
System.out.println("my ServerSocket started");
System.out.println("listening:\n"+InetAddress.getLocalHost()+":"+serverSocket.getLocalPort());
} catch (IOException e) {
e.printStackTrace();
}
}
public void WaitClient() throws InterruptedException{
try {
Inicio.LOG("Waiting Connection...");
Socket socket = serverSocket.accept(); // blocking wait ( 99.9999% of the time in this line )
BufferedReader buff_Reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),Charset.forName("UTF-8")));
BufferedWriter buff_Writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),Charset.forName("UTF-8")));
System.out.println("<Conected>");
System.out.println("IP Client: " + socket.getInetAddress());
Inicio.LOG("Conected -> IP Client: " + socket.getInetAddress());
ReadThread reader_thread = new ReadThread(buff_Reader);
WriteThread writer_thread = new WriteThread(buff_Writer);
ConectionClient newconn = new ConectionClient(this,reader_thread,writer_thread,socket);
Conections.add(newconn);
System.out.println("Number of Conections:"+Conexoes.size());
newconn.start(); // stats the thread thats holds the conection with that guest
} catch (IOException e ){//SQLException e) {
System.out.println("<Error>");
Inicio.Erro("Server Stoped with Error:"+e.getMessage());
e.printStackTrace();
KeepWaiting=false;
}
finally{
// ends the server
}
}
所以我在这里试图找到一些解决我问题的方法。有什么帮助可以让我确定问题所在吗?ISP、防火墙、NAT、有缺陷的UPnP、阻塞代理等等
让我的路由器再次感到高兴的是“重启”,在一段时间内(几个小时,有时几分钟…)一切正常,我的传送系统工作正常,但这会使服务器离线5到10分钟,我希望这能在不中断的情况下保持6个小时,或者一些客户会对我的错误服务器/客户机感到失望
为了测试端口是否打开,我还使用了这个网站,他们说端口是打开的,我的程序检测到有人尝试连接。。。所以如果这个网站的服务器可以连接到我的服务器。。。为什么我不能
Abhi在测试了
简单的东西之后添加了结果
ARP条目:
- 服务器工作时:
- 服务器不工作时:
通过iptables的NAT规则:
这可能是一个unix命令,也可能是因为我只在unix系统中找到了查看此命令的信息和支持,在长时间搜索后,我发现命令“Route print”的打印方式有点像iptable
- 服务器工作时:
- 服务器不工作时:
防火墙日志
当服务器工作时,显示允许连接,但当不工作时,防火墙的日志不会显示任何关于断开连接的信息。。。只显示许多位置的允许,但不要跟踪任何关于我的Telnet的信息,或者当我尝试从另一个客户端连接时
当我禁用防火墙时,服务器仍然无法访问
路由器日志
在路由器日志中:
- 当telnet从我的服务器机器连接到外部ip或主机时
21:24:12(自上次启动以来)**SYN-Flood**192.168.1.87269->>179.252.7.19650000(从PPPoE1出站)
- 当telnet从另一台本地计算机连接到外部ip或主机时
21:28:02(自上次启动以来)**SYN Flood**192.168.1.560810->179.252.7.19650000(从PPPoE1出站)
- 当telnet从我的服务器机器或另一台本地机器连接到我的本地ip时,simple不记录任何有关的信息
- 当打开一个在线端口检查器并点击检查时,表示该端口已打开,但路由器日志显示
21:30:17(自上次启动以来)**SYN Flood**88.198.46.5147508->>192.168.1.85000(来自PPPoE1入站)
路由器日志显示服务器不工作时
Microsoft消息分析器工具
已筛选日志的打印:
要查看的内容:
- 从我的服务器计算机到外部ip或主机的telnet出现时
Application\tTCP:重新传输的SYN,原始消息是#1524
- 当telnet从另一台本地计算机连接到外部ip或主机时,不需要记录任何内容
- 当telnet从我的服务器机器或另一台本地机器连接到我的本地ip时,一切都正常
- 当打开联机端口检查器时,将我的外部ip和端口50000放入并单击以检查,表示可以访问,并且在消息分析工具中记录为SuccessFull链接,有趣的是,“目的地”似乎是我的本地ip,那么它们如何连接到我的本地ip
尝试以下几件事—(i)查看路由器和防火墙上的诊断日志(ii)在服务器上运行网络流量分析器,如Microsoft Message analyzer(iii)可能是“某物”即将过期。在路由器上查看可能影响过期的设置/规则今天晚些时候重新启动了路由器,服务器当前正在工作,当我看到防火墙日志时,我看到允许连接,在路由器日志中,我没有找到任何明确的信息
@Override
public void run()
{
try {
connect();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void connect() throws InterruptedException
{
try {
exaustive_connect();
if(connection.isConnected()&&Continue) {
BufferedReader buff_reader = new BufferedReader(new InputStreamReader(new myInputStream(connection.getInputStream()), Charset.forName("UTF-8")));
BufferedWriter buff_writer = new BufferedWriter(new OutputStreamWriter(new myOutputStream(connection.getOutputStream()),Charset.forName("UTF-8")));
Reader = new ReadThread(buff_reader);
Writer = new WriteThread(buff_writer);
Communicate(); // method that listen and write messages.
}
else
{
ManageConection.E("ConexaoServidor","could not connect");
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
close(); // method that close the socket, reader and writer.
}
}
private void exaustive_connect()
{
try {
if(!exaustive_tryconn(500))
{
if(!exaustive_tryconn(2000))
{
if(!exaustive_tryconn(5000))
{
ManageConection.LOG("could not connect");
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
private boolean exaustive_tryconn(int timeout)
{
connection = new Socket();
try {
connection.connect(new InetSocketAddress(ManageConection.IP, ip_holder.port), timeout); // tries the first host
} catch (Exception e) {
e.printStackTrace();
}
if(connection.isConnected())return true;
connection = new Socket();
try {
connection.connect(new InetSocketAddress(ManageConection.IP2, ip_holder.port), timeout); // tries the second host
} catch (Exception e) {
e.printStackTrace();
}
return connection.isConnected();
}