2017-09-17 89 views
0

對連接單個服務器的多個客戶端有疑問。這裏是我的服務器端代碼:多個客戶端連接服務器java

//...  
ServerSocket serverSocket = null; 
     try{ 
      serverSocket = new ServerSocket(port); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
     Socket server = null; 

     while(true){ 
      try{ 
       server = serverSocket.accept(); 
       new createdThread(server).start(); //This is a thread class specified somewhere else to handle the socket. 
      }catch(IOException e){ 
       e.printStackTrace(); 
      } 

createdThread()是,將開始處理插座一個線程,它需要的Socket server作爲參數。假設我有一個連接並啓動一個線程,接受的套接字作爲參數傳遞給線程。在這種情況下,如果我沒有錯,應該傳遞server作爲參考。如果在第一個線程結束之前,serverSocket將獲得一個新連接並創建一個新套接字,該套接字將更改server的值。這會影響第一個線程的執行,因爲第一個線程將引用作爲其參數,這意味着該引用的基礎對象被更改了嗎?

我測試了程序,它看起來運行良好。雖然它們的所有構造函數參數都是對同一個對象的引用,但每個線程並沒有相互影響。這對我沒有意義,並希望有人能夠澄清。謝謝。

回答

1

當服務器對象傳遞給createdThread()方法時,會創建與其相同引用的第二個副本。看看「圖1」here。所以當你改變循環內的服務器對象的值時,一個引用會丟失,但是第二個引用仍然存在於線程使用的方法內。

+0

第二*拷貝*的* *相同創建參考的。 – EJP

1

假設我有一個連接並啓動一個線程,接受的套接字作爲參數傳遞給線程。

按價值。換句話說,通過複製。

在這種情況下,如果我沒有錯,服務器應該作爲參考傳遞。

至於Socket基準的

如果在第一個線程結束之前,serverSocket會創建一個新的連接並創建一個新的套接字,這將更改值server

正確。

沒有也受此影響的第一個線程

以來的第一個線程執行爲基準作爲參數

沒有它不「T。它將引用的作爲它的參數,並且(可能)將其存儲到另一個變量中。不是原來的server變量。

這意味着該引用的基礎對象是否發生了變化?