2017-04-11 71 views
0

我有一個基於服務器 - 多個客戶端交互的應用程序。這是我在服務器類中使用的線程創建一個新線程,我接受所有新套接字:Java從套接字獲取ObjectInputStream ObjectOutputStream

Thread acceptingThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      while (true) { 
       try { 
        Socket s = serverSocket.accept(); 
        listaSocket.add(s); 
        listaOis.add(new ObjectInputStream(s.getInputStream())); 
        listaOos.add(new ObjectOutputStream(s.getOutputStream())); 
        System.out.println("Client connected"); 
       } catch (IOException ex) { 
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 

     } 

    }); 
    acceptingThread.start(); 




private ServerSocket serverSocket; 
private ArrayList<Socket> listaSocket; 
private ArrayList<ObjectInputStream> listaOis; 
private ArrayList<ObjectOutputStream> listaOos; 

阻斷程序的行是:

    listaOis.add(new ObjectInputStream(s.getInputStream())); 
        listaOos.add(new ObjectOutputStream(s.getOutputStream())); 
+1

閱讀ObjectInputStream構造函數的javadoc。 –

+1

我認爲serverSocket.accept()是阻止程序,它等待新的請求來。 –

+0

在我的客戶端我正在做一個套接字連接到這臺服務器。在我從客戶端獲取套接字。ObjectInputStream需要一個InputStream在他的構造函數。我從s.getInputStream() – Cristian

回答

1

您的代碼在該特定線阻斷:

    listaOis.add(new ObjectInputStream(s.getInputStream())); 

注意這個ObjectInputStream構造函數的行爲。從Javadoc

創建從指定的InputStream讀取的ObjectInputStream。從流中讀取序列化流頭並進行驗證。 此構造函數將阻塞,直到相應的ObjectOutputStream寫入並刷新標題。

獲取從傳入連接的InputStream意味着需要串行化的數據通過所述連接發送。這意味着您必須在構造函數繼續之前執行以下操作:

  1. 從客戶端連接。我認爲你已經這樣做了,因爲你可以通過socket.accept()
  2. 使用新連接打開OutputStream。用ObjectOutputStream包裝OutputStream
  3. 通過ObjectOutputStream發送一些數據(即寫入一些可序列化的數據並刷新)。
相關問題