2015-10-15 46 views
1

我試圖通過網絡發送一個對象到另一臺計算機(或同一臺計算機),然後讓計算機發回一個對象。套接字早期多次傳輸

在發送計算機上,我發送的對象和接收返回的對象:

ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
     objectOutputStream.writeObject(object); 
     Object returnedObject; 
     socket.setSoTimeout(timeout); 
     try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) { 
      returnedObject = (Object) ois.readObject(); 
     } 
     return returnedObject; 

在接收計算機,我接收對象:

Object object; 
     socket.setSoTimeout(timeout); 
     try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) { 
      object = (Object) ois.readObject(); 
     } 
     return object; 

然後發送對象返回:

socket.setSoTimeout(timeout); 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 
     objectOutputStream.writeObject(object); 

的錯誤我得到的回覆是:

重度:空java.net.SocketException異常:套接字在 java.net.Socket.setSoTimeout(Socket.java:1137)在

關閉,它同時嘗試發送對象返回發生在接收計算機上。

發送計算機上的套接字使用與接收計算機上的套接字相同的地址和端口。

回答

0

您正在使用一個非常小範圍的嘗試,與資源:

try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) { 
    returnedObject = (Object) ois.readObject(); 
} 

該代碼被解釋爲:

  • 獲取輸入流,並圍繞它建立一個ObjectInputStream
  • 閱讀來自所述對象流
  • 關閉ObjectInputStream的對象。

當您關閉ObjectInputStream它會自動關閉備份它,這是socket的輸入流InputStream。並且documentation of getInputStream說:

關閉返回的InputStream將關閉相關的套接字。

你應該確保在try-與資源有一個更大的範圍覆蓋插座的整個生命週期,或避免使用try-與資源,並確保您關閉ObjecInputStream妥善當你與完成它或出現錯誤時。

2

這個例外意味着關閉了插座,然後繼續使用它。具體而言,您在聲明的try-with-resources塊末尾關閉了ObjectInputStream。這關閉了套接字的其他流和套接字本身。

不要在每次傳輸中使用新的對象流。在兩端使用相同的插座壽命。