Java:当Internet可用时,客户端自动连接到服务器

时间:2014-06-25 02:31:56

标签: java client-server client

我制作了一个可以通过互联网连接的客户端 - 服务器应用程序。我在我的客户端硬编码了已修复的服务器IP。

我的问题是我想要一种不会占用大量处理和内存的方法。 我希望我的客户端检查互联网是否可用,然后尝试连接到服务器,如果它已启动并运行。如果没有,那么等待再试一次。 请记住,应用程序应该始终在您的计算机上全天候运行,并且尽可能像Skype一样连接,从某种意义上说它始终打开,当您有互联网可用且服务器可访问时,它会连接。

我的客户端连接到服务器的代码:

private void connectToServer() throws Exception {
    showMessage("Attempting Connection... \n");
    try{
    connection = new Socket(InetAddress.getByName(serverIP), 6789);

    showMessage("Ok dude you are Connected to:" + connection.getInetAddress().getHostName());}
    catch(IOException e){
        int x = 0;
        while (true){
            try {
                showMessage("Sorry Your IP was not found, \nAutomatic detection:");
                showMessage("Now trying again");
                connection = new Socket(InetAddress.getByName(serverIP),6789);


                break;
            } catch (UnknownHostException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
                showMessage("\nConnection not established, trying again\n");
            }
            /*x++;
            if(x>10) break;*/
        }
        //throw new Exception();
    }
}

这确实有效但需要大量的处理和记忆!

我知道通过添加thread.sleep(5000),我最终会添加它们等... 但这并不能解决内存问题。我的程序将运行很长时间,但这并不能阻止不可避免的事情发生。

有更好的方法吗?

感谢

P.S:showMessage()只是我在GUI上显示输出的函数

我检查内存的方式是使用Window的任务管理器! (记忆力急剧增加)

2 个答案:

答案 0 :(得分:0)

正如您在问题中已经提到的那样,您应该在循环中添加对Thread.sleep()的调用。正如你的代码现在所处的那样,它会运行一个紧密的无限循环,这对CPU来说非常沉重。

至于内存使用情况,你确定使用的内存实际上在增长吗?即使对于一个简单的程序,JVM也可能正在分配大量内存 - 您应该检查以确保使用量实际增长。如果它确实是一个问题,可能只是因为你在紧密循环的每个循环中创建一个新的Socket,在这种情况下添加sleep()调用将通过允许GC处理旧的Socket来解决问题对象及时。

顺便说一句,您是否注意到如果第一个代码失败,您的代码会再次执行完全相同的检查?为什么不立即启动循环并在循环中执行一次检查?这样可以显着降低代码的复杂性。查看通常被称为“不要重复自己”的软件指南以了解更多信息。

答案 1 :(得分:0)

看来你有两个问题

  1. 如何查询互联网 - 请参阅
  2. Preferred Java way to ping an HTTP URL for availability

    Detect internet Connection using Java

    How to check if internet connection is present in java?

    1. 内存泄漏
    2. 如果连接失败,您需要清理套接字对象。