2016-12-15 84 views
0

所以我正在構建一個小型聊天應用程序,但我在設置我的服務器時遇到了一些麻煩。下面的代碼是我在我的服務器線程的構造函數:嘗試創建流時產生無限循環

public ServerThread() { 
    System.out.println("Before"); 

    try { 
     ServerSocket serverSocket = new ServerSocket(3500); 
     socket = serverSocket.accept(); 
     System.out.println("After"); 
     outputStream = new ObjectOutputStream(socket.getOutputStream()); 
     inputStream = new ObjectInputStream(socket.getInputStream()); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    executor = Executors.newFixedThreadPool(3); 
    connected = true; 
} 

正如你可以看到我有2幅版畫,「之前」和「之後這兩者之間,東西happends導致程序進入無限循環。 socket = serverSocket.accept();我也無法捕捉到這個例外,不知道這裏有什麼問題

+3

你甚至知道'accept()'做什麼嗎? –

+0

提示:嘗試在3500上連接到正在運行的服務器,並且看到「無限循環」畢竟不是那麼無限。 – dasblinkenlight

+1

服務器套接字**等待**請求通過網絡進入。 您的'serverSocket.accept();'將等待連接完成 –

回答

0

(我現在還不能評論),但accept()會阻塞,直到連接成功,它也不是無限循環,它只是該方法將阻塞,直到某物連接到該插座。

您確定您的客戶端連接正常嗎?

0

ServerSocket - 「服務器套接字等待請求通過網絡進入」。它根據該請求執行一些操作,然後可能將結果返回給請求者。

所以這裏accept()是一個阻止呼叫。即 - 系統將等待客戶端請求,遇到它時將產生相應的響應(如 - 爲每個傳入請求分配新端口並執行給定操作)

那麼如何檢查出它。

嘗試創建客戶端類並將其與服務器應用程序連接。即 -

socket = new Socket(<serverName/host/ip>, <serverPort>); 
     System.out.println("Connected: " + socket); 

當服務器運行時,嘗試運行給定的代碼,它會發送一個請求,服務器會相應地處理它。 希望它有幫助:)

+0

是的,我理解這一點,但只要沒有客戶連接,整個程序就會在幾秒鐘內凍結並崩潰。這發生即使連接發生在另一個線程然後gui線程。 – snubbegubben

+0

如果沒有客戶端連接,則服務器應該凍結(因爲沒有環路在這裏,所以它將處理單個連接)。 你可以嘗試運行沒有線程的服務器,因爲單個服務器可以處理多個請求+如果我沒有錯,你嘗試創建3個服務器線程,並且它們都應該在端口3500上工作。(P1。正確理解) 請關閉使用後插座。 – freesoul