簡體   English   中英

如何重新打開Java套接字

[英]How to reopen a Java socket

我正在循環讀取Java Socket。

如果讀取引發異常,我想重新打開套接字。

為了測試這一點,我只是關閉套接字並捕獲異常。

問題是,當我嘗試重新打開套接字時:

serverSocket = new ServerSocket(port)
socket = serverSocket.accept()

它拋出一個異常:

java.net.BindException: The socket name is already in use

這是測試的直接問題。 但是它也可能在生產中發生。

引發異常后,如何通過打開新的套接字連接來可靠地恢復?

如果您誤會了您的意思,對不起。

如果套接字上的read()方法失敗,則不會關閉ServerSocket。

您仍然應該能夠調用serverSocket.accept()而不創建一個新的。 我認為這就是為什么您得到BindException的原因。

您需要創建一次ServerSocket,然后將任何可接受的套接字傳遞給其處理程序-通常是在其他線程中完成。

您收到的錯誤是因為您試圖在同一端口上偵聽兩次,這是不可能的。

本文可能會為您提供幫助。 這是代碼示例之一:

public void await() {
    ServerSocket serverSocket = null;
    int port = 8080;
    try {
        serverSocket =  new ServerSocket(port, 1,
        InetAddress.getByName("127.0.0.1"));
    }
    catch (IOException e) {
        e.printStackTrace();
        System.exit(1);
    }

    // Loop waiting for a request
    while (!shutdown) {
        Socket socket = null;
        InputStream input = null;
        OutputStream output = null;
        try {
            socket = serverSocket.accept();
            input = socket.getInputStream();
            output = socket.getOutputStream();

            // create Request object and parse
            Request request = new Request(input);
            request.parse();

            // create Response object
            Response response = new Response(output);
            response.setRequest(request);
            response.sendStaticResource();

            // Close the socket
            socket.close();

            //check if the previous URI is a shutdown command
            shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
        }
        catch (Exception e) {
            e.printStackTrace();
            continue;
        }
    }
}

我發現可以工作的是:

  1. 關閉ServerSocket
  2. 創建一個新的ServerSocket

關閉ServerSocket之后無需延遲。 那是在IBM AIX機器上-也許在其他平台上的行為是不同的。

無需關閉套接字。

我還向套接字添加了超時,以從連接的另一端恢復。 這是在啟動和異常時運行的代碼:

if (serverSocket != null) serverSocket.close();
serverSocket = new ServerSocket(port);
socket = serverSocket.accept();
socket.setSoTimeout(TIMEOUT);
is = socket.getInputStream();

也感謝您提供關閉ServerSocket的提示。 那使我走上了正軌。 並提供有用的網絡編程參考。

在連接會話期間引發異常時,應該關閉套接字。

暫無
暫無

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

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