很抱歉noob问题,但我正在创建一个客户端 - 服务器应用程序。
如果我在主类的方法中创建从客户端到服务器的连接,那么在方法执行完毕后该连接是否会保持打开状态?
到目前为止,我有一个GUI,询问主机名,然后调用Connect
方法。方法返回后程序继续执行,方法内部的连接是否保持打开状态?
public static void main(String[] args) {
ConnectionGUI connect = new ConnectionGUI();
}
public boolean Connect(String hName) {
Socket clientSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
clientSocket = new Socket(hName, 16000);
out = new PrintWriter (clientSocket.getOutputStream(), true);
in = new BufferedReader (new InputStreamReader(clientSocket.getInputStream()));
return true;
} catch(Exception e) {
return false;
}
}
答案 0 :(得分:1)
最好确保Socket关闭。
您可以通过添加finally块来执行此操作:
finally {
clientSocket.close();
}
或者改为使用try-with-resources
try(Socket clientSocket = new Socket(hName, 16000)) {
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
return true;
}catch(Exception e){
return false;
}
答案 1 :(得分:1)
是的,没有关闭的调用,所以在程序停止之前,套接字将保持打开状态。
使用try-with-resources
创建一个可以访问AutoCloseable资源的块,并且一旦块被丢弃就会自动关闭它,即使抛出Throwable也是如此。
答案 2 :(得分:0)
是的。将方法称为行为的对象仍然留下他们使用的方法的元素。 Java是内存安全的,所以当你的对象不再使用,并且对象的方法有例如打开连接时,连接将保持打开状态,但是对象将被删除...这是因为垃圾java中的收藏家。
<强>修正:强>
使用您自己的finalize()覆盖通用超类(java.lang.Object)中的finalize方法,该方法将在对象不再使用时关闭连接。垃圾收集器将在删除对象时调用您的finalize方法,并关闭连接。