2012-02-01 27 views
0

客戶端代碼:的ObjectOutputStream不發送數據

try { 
      Socket socket = new Socket(ip, port); 
      OutputStream output = socket.getOutputStream(); 
      ObjectOutputStream out = new ObjectOutputStream(output); 
      InputStream input = socket.getInputStream(); 
      ObjectInputStream in = new ObjectInputStream(input); 
      out.writeByte(1); 
      FileHandler fh = (FileHandler) in.readObject(); 
      //processing stuff 
      out.flush(); 
      out.close(); 
      output.flush(); 
      output.close(); 
      input.close(); 
      in.close(); 
      socket.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

Server代碼:

 try { 
      ServerSocket server = new ServerSocket(port); 
      Socket socket = server.accept(); 
      InputStream input = socket.getInputStream(); 
      ObjectInputStream in = new ObjectInputStream(input); 
      int type = in.readByte(); 
      //processing stuff (which includes closing the streams and sending FileHandler object) 
      socket.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

服務器永遠不會接收的字節。它只是等待來自客戶端的字節,它永遠不會來。我不確定它爲什麼不發送或收到。任何幫助深表感謝。

回答

3

如果我不得不猜測這是因爲在你的客戶端你阻止​​等待服務器發送給你一些東西,因此從來沒有刷新輸出流......因此沒有發送任何東西。

將您的讀取移動到您刷新您的輸出流。

+0

也不要衝洗或關閉輸出。如果你包裝一個OutputStream,調用close或者flush或者close關閉它將依次刷新包含的流。您不需要保存對輸出或輸入的引用。關閉應該放在finally子句中,如果拋出異常,你仍然需要確保close()流發生。 – chubbsondubs 2012-02-01 06:08:46

+0

當我在發送字節後刷新時,服務器會收到連接重置錯誤。 – Stripies 2012-02-01 06:09:17

+0

@JonMannerberg - 不,它會在你關閉連接時得到。在完成閱讀和寫作之前,不要關閉它。 – 2012-02-01 06:10:51