如果在方法中创建服务器连接是否保持打开状态?

时间:2017-10-20 12:12:25

标签: java

很抱歉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;
    }
}

3 个答案:

答案 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方法,并关闭连接。