我設置了一個客戶端和服務器套接字。當我使用類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();
}
感謝您的時間
我發送消息的機器人似乎只理解dataoutputstream.writebytes,有沒有辦法在讀取它時關閉流? –