【问题标题】:Java: Client automatically connecting to server when internet is availableJava:当互联网可用时客户端自动连接到服务器
【发布时间】:2014-06-25 02:31:56
【问题描述】:

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

我的问题是我想要一种不需要大量处理和内存的方法。 我希望我的客户检查互联网是否可用,然后尝试连接到服务器(如果它已启动并正在运行)。如果没有,那就等待再试一次。 请记住,该应用程序应该始终 24/7 全天候在您的计算机上运行,​​并在可能的情况下连接,就像 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 的任务管理器! (内存急剧增加)

【问题讨论】:

  • 这似乎是问题connection = new Socket(InetAddress.getByName(serverIP),6789);。即使连接不成功,它也会创建一个新的 Socket 连接对象而不清除它,这就是为什么你有太多的连接对象正在消耗你的内存。尝试在连接不可用时找到清除对象的方法。

标签: java client-server client


【解决方案1】:

正如您已经在问题中指出的那样,您应该在循环中添加对 Thread.sleep() 的调用。就目前的代码而言,它会运行一个紧密的无限循环,这将对 CPU 造成很大负担。

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

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

【讨论】:

  • 我确实看到了重复,最初代码实际上是在寻找另一个替代地址。我改变了它,使我的问题更容易理解。无论如何感谢您指出这一点。
【解决方案2】:

看来你有两个问题

  1. 如何检查互联网是否可用 - 请参考

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. 内存泄漏

如果连接失败,你需要清理套接字对象。

【讨论】:

  • 内存泄漏怎么办?当连接变量每次都指向一个新的套接字时,垃圾收集器不处理之前的套接字吗?
猜你喜欢
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2011-12-26
  • 2022-01-05
  • 2020-07-21
  • 1970-01-01
相关资源
最近更新 更多