2014-04-19 48 views
1

我設置了一個客戶端和服務器套接字。當我使用類ObjectOutputStream和ObjectInputStream和方法readObject/writeObject一切正常。使用DataInputStream和DataOutputStream和套接字的管道破損

它模擬與機器人的通信,我知道肯定只解釋方法 DataOutputStream.writeBytes。

因此,我設置了新的仿真架構,因爲機器人不能用於每天的測試。

在以下代碼中,ObjectOutputStream/ObjectInputStream的readObject/writeObject被替換爲DataInputStream/DataOutputStream的writeBytes和IOutils.toByteArray。 服務器套接字正確接收消息,但是當它嘗試寫回響應時,我得到一個斷開的管道,就好像連接已關閉。 請注意,我從不關閉套接字或流,因爲機器人甚至可以在30秒後應答。 任何幫助,使DataOutputStream.writeBytes工作,將不勝感激。

這裏的非工作代碼:

客戶:

Socket serverSocket = new Socket("server", 9899); 
DataOutputStream outputStream = new DataOutputStream(serverSocket.getOutputStream()); 
//ObjectOutputStream outputStream = new ObjectOutputStream(serverSocket.getOutputStream()); 
//outputStream.writeObject("\n" + "message" + "\r"); 
outputStream.writeBytes("\n" + "message" + "\r"); 
outputStream.flush(); 

DataInputStream inputStream = new DataInputStream(serverSocket.getInputStream()); 
//ObjectInputStream inputStream = new ObjectInputStream(serverSocket.getInputStream()); 
byte [] bytes = IOUtils.toByteArray(inputStream); 
String serverResponse = new String(bytes,"UTF-8"); 
// String serverResponse = (String)inputStream.readObject(); 

服務器:

ServerSocket serverSocket = new ServerSocket(9899); 

while (true) { 

Socket socket = serverSocket.accept(); 

//ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream()); 
DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 
byte [] bytes = IOUtils.toByteArray(inputStream); 
String message = new String(bytes,"UTF-8"); 
//String message = (String) inputStream.readObject(); 
Thread.sleep(15000); 

//ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); 
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 
//outputStream.writeObject("server response"); 
outputStream.writeBytes("server response"); //EXCEPTION THROWN HERE FOR BROKEN PIPE 
outputStream.flush(); 

      } 

感謝您的時間

回答

0

IOUtils.toString(InputStream的)必須讀直到它結束,這意味着該對象已經斷開連接。所以你不能寫信給它。

如果你正在與數據流交換字符串,你應該使用writeUTF()和readUTF()。

或者使用BufferedReader/Writer讀取和寫入行。

+0

我發送消息的機器人似乎只理解dataoutputstream.writebytes,有沒有辦法在讀取它時關閉流? –