簡體   English   中英

我可以正確關閉這個插座嗎?

[英]Am i closing this socket correctly?

在大多數情況下,它可以工作,但是有時卻不起作用,該代碼僅if(input.equals("Done")){時才關閉套接字,我可以正確關閉嗎? ,在我看來,無論我嘗試關閉它的代碼是什么? 誰能向我確認或更正?

Socket socket1;
int portNumber = 4445;
socket1 = new Socket(InetAddress.getLocalHost(), portNumber);
BufferedReader br = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
PrintWriter pw = new PrintWriter(socket1.getOutputStream(), true);

pw.println("Hello");
pw.println("Hello");
pw.println("Hello");
pw.println("Hello");

String input = br.readLine();
while ((input = br.readLine()) != null) {
    if(input.equals("Hi")){
        pw.println("Hello");
    }
    else  if(input.equals("Done")){
        break;
    }

    br.close();
    pw.close();
    socket1.close();
}

首先,您將對象放置在 while循環內,因此無論接收到第二條消息,它們都將被放置(在while循環之前,您將第一個行跳過了)。 如果第二條消息有可能被完成,那么您將退出循環而沒有任何套接字處置,因此它們仍在您的內存中。 而且,正如注釋中指出的那樣,如果您的任何對象引發異常,則可能會遇到問題。 此應用程序的正確版本為:

Socket socket1 = null;
int portNumber = 4445;
BufferedReader br = null;
PrintWriter pw = null;
try
{
    socket1 = new Socket(InetAddress.getLocalHost(), portNumber);
    br = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
    pw = new PrintWriter(socket1.getOutputStream(), true);

    pw.println("Hello");
    pw.println("Hello");
    pw.println("Hello");
    pw.println("Hello");

    String input = null;
    while ((input = br.readLine()) != null) {
        if(input.equals("Hi")){
            pw.println("Hello");
        }
        else  if(input.equals("Done")){
            break;
    }
}
finally
{
    if(br != null) br.close();
    if(pw != null) pw.close();
    if(socket1 != null) socket1.close();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM