2017-03-05 69 views
0

我在嘗試從客戶端將數據發送回服務器(可能被看作是一種POST,雖然我不使用http)時得到了java.io.EOFExceptionObjectInputStream#readObject拋出java.io.EOFException

我的客戶端源代碼:

Socket clientSocket = new Socket(serverIpAddr, IConstant.ServerPort); 
OutputStream out = clientSocket.getOutputStream(); 
out.write(dataByteArray); 
out.flush(); 
if(out!=null) 
    out.close(); 
if(clientSocket!=null) 
    clientSocket.close(); 

我的服務器源代碼:

try{  
     ServerSocket serverSocket = new ServerSocket(IConstant.ServerPort); 
     while(true) 
     { 
      Socket connectionSocket = serverSocket.accept(); 
      ObjectInputStream ois = new ObjectInputStream(connectionSocket.getInputStream()); 
      Object obj = ois.readObject(); 
      byte[] bytes = (byte[])obj; 
      System.out.println("A notification has been received"); 
      //process bytes 
      //... 
     } 
} catch(IOException ex){ 
    ex.printStackTrace(); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
} 

這我如何建立我dataByteArray對象(其中PlayList是實現java.io.Serializable一個POJO) :

private byte[] serializePlayList(PlayList playList) throws IOException{ 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     byte[] byteArray = null; 
     ObjectOutput out = null; 
     try { 
      out = new ObjectOutputStream(bos); 
      out.writeObject(playList); 
      out.flush(); 
      byteArray = bos.toByteArray(); 
     } finally { 
      try { 
      bos.close(); 
      } catch (IOException ex) { 
      } 
     } 
     return byteArray; 
    } 

每當服務器嘗試執行ois.readObject()java.io.EOFException被拋出。任何人都可以解釋爲什麼?

+1

你寫了一個簡單的輸出流,而是從對象輸入流中讀取。爲什麼不寫入對象輸出流?或者,你如何構建'dataByteArray'以確保它是一個完整的對象圖? –

+0

@Andy:我已更新我的線程並添加了用於構建dataByteArray對象的方法 –

+0

您確定客戶端正在寫入數組,而不是拋出異常嗎? –

回答

-1

我得到一個java.io.EOFException嘗試發送數據

不,你不是。你試圖收到數據。

您的發送代碼沒有意義。您應該將PlayList對象直接序列化到現有的ObjectOutputStream,而不是所有這些具有ByteArrayOutputStreams的欺騙和每個發送的新對象流。

因此,您還應該將readObject()的結果直接投射到PlayList

閱讀代碼應循環直到EOFException已被捕獲,這意味着對等關閉連接。

NB clientSocketout在您測試它們的點上不可能爲空。

+0

@downvoter請解釋一下。 – EJP

0

你應該Object發送playList

客戶:

Socket clientSocket = new Socket(serverIpAddr, IConstant.ServerPort); 
ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream(); 
out.writeObject(playlist); 

服務器:

ServerSocket serverSocket = new ServerSocket(IConstant.ServerPort); 
Socket connectionSocket = serverSocket.accept(); 
ObjectInputStream ois = new ObjectInputStream(connectionSocket.getInputStream()); 
PlayList playList = (PlayList) ois.readObject();