我制作了一个可以通过互联网连接的客户端 - 服务器应用程序。我在我的客户端硬编码了已修复的服务器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的任务管理器! (记忆力急剧增加)
答案 0 :(得分:0)
正如您在问题中已经提到的那样,您应该在循环中添加对Thread.sleep()的调用。正如你的代码现在所处的那样,它会运行一个紧密的无限循环,这对CPU来说非常沉重。
至于内存使用情况,你确定使用的内存实际上在增长吗?即使对于一个简单的程序,JVM也可能正在分配大量内存 - 您应该检查以确保使用量实际增长。如果它确实是一个问题,可能只是因为你在紧密循环的每个循环中创建一个新的Socket,在这种情况下添加sleep()调用将通过允许GC处理旧的Socket来解决问题对象及时。
顺便说一句,您是否注意到如果第一个代码失败,您的代码会再次执行完全相同的检查?为什么不立即启动循环并在循环中执行一次检查?这样可以显着降低代码的复杂性。查看通常被称为“不要重复自己”的软件指南以了解更多信息。
答案 1 :(得分:0)
看来你有两个问题
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?
如果连接失败,您需要清理套接字对象。