简体   繁体   English

使用DataInputStream和DataOutputStream和套接字的管道断开

[英]Broken pipe using DataInputStream and DataOutputStream and sockets

I set up a client and server sockets. 我设置了一个客户端和服务器套接字。 When I use classes ObjectOutputStream and ObjectInputStream and the method readObject/writeObject everything works fine. 当我使用类ObjectOutputStream和ObjectInputStream以及方法readObject / writeObject时,一切正常。

It simulates communication with a robot that I know for sure interprets correctly only method DataOutputStream.writeBytes. 它模拟与我肯定可以正确解释仅方法DataOutputStream.writeBytes方法的机器人的通信。

So I set up the new architecture for simulation since the robot is not available for testing on a daily basis. 因此,我设置了用于仿真的新架构,因为该机器人每天都无法进行测试。

In the following code where ObjectOutputStream/ObjectInputStream readObject/writeObject were replaced with DataInputStream/DataOutputStream writeBytes and IOutils.toByteArray. 在以下代码中,其中ObjectOutputStream / ObjectInputStream readObject / writeObject被替换为DataInputStream / DataOutputStream writeBytes和IOutils.toByteArray。 The server socket correctly receives the message but when it tries to write back a response I get a broken pipe as if the connection was closed somewhere. 服务器套接字正确接收了该消息,但是当它尝试写回响应时,我得到了一条断开的管道,好像该连接在某处关闭了。 Notice that I never close sockets or streams because the robot can answer even after 30 seconds. 请注意,我从不关闭套接字或流,因为即使30秒后机器人仍可以应答。 Any help to make DataOutputStream.writeBytes work would be appreciated. 使DataOutputStream.writeBytes工作的任何帮助将不胜感激。

Here's the non-working code: 这是无效的代码:

Client: 客户:

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();

Server: 服务器:

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();

            }

Thanks for your time 谢谢你的时间

IOUtils.toString(InputStream) must read the stream until its end, which would imply that the peer has disconnected. IOUtils.toString(InputStream)必须读取流,直到流结束为止,这意味着对等方已断开连接。 So you can't write to it. 所以你不能写它。

If you're exchanging Strings with data streams you should use writeUTF() and readUTF(). 如果要与数据流交换字符串,则应使用writeUTF()和readUTF()。

Or read and write lines, with a BufferedReader/Writer. 或使用BufferedReader / Writer读写行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM