Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试使用外部IP将我的Android客户端连接到我的计算机_Java_Android_Sockets_Communication_Serversocket - Fatal编程技术网

Java 尝试使用外部IP将我的Android客户端连接到我的计算机

Java 尝试使用外部IP将我的Android客户端连接到我的计算机,java,android,sockets,communication,serversocket,Java,Android,Sockets,Communication,Serversocket,我正在尝试制作一个服务器-客户机模型,其中一个java应用程序将成为服务器,一个android应用程序将在侦听端口(任意选择50000)中与我的服务器计算机建立套接字连接 android应用程序注册、登录、发出一些信息请求并发送一些响应。服务器程序监听一个或多个客户机并从MySQL数据库中获取一些信息,当客户机结束请求时,会打印一张他们购买的财务票据 几乎所有作品: 在我的路由器中配置了uPnP端口转发 我的java程序已打开并在正确的端口中侦听(端口50000正在侦听,在命令netstat中

我正在尝试制作一个服务器-客户机模型,其中一个java应用程序将成为服务器,一个android应用程序将在侦听端口(任意选择50000)中与我的服务器计算机建立套接字连接

android应用程序注册、登录、发出一些信息请求并发送一些响应。服务器程序监听一个或多个客户机并从MySQL数据库中获取一些信息,当客户机结束请求时,会打印一张他们购买的财务票据

几乎所有作品:

  • 在我的路由器中配置了uPnP端口转发
  • 我的java程序已打开并在正确的端口中侦听(端口50000正在侦听,在命令netstat中)
  • 我的外部IP在动态DNS主机中解析(我使用的网站没有IP),当我ping到我的主机时,会返回正确的外部IP
  • 几乎在我的路由器“开心”的时候,一切都正常了
一段时间后(数小时、数分钟),无法访问外部访问,原因不明:

  • 外部IP不变(本地IP不变)
  • 端口保持可见(在许多port tester网站上进行了测试,我的程序也打印出有人在检查端口时尝试了连接)
  • 我可以ping到我的主机并解析到正确的IP
  • 如果android应用程序在同一个网络中,并且使用本地IP(我的电脑是192.168.1.8),它就可以连接
但当我尝试执行telnet时,事情变得不清楚:

  • 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的工作时)
使用ServerSocket打开服务器的服务器端应用程序的java代码:

@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();
}