繁体   English   中英

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

[英]Broken pipe using DataInputStream and DataOutputStream and sockets

我设置了一个客户端和服务器套接字。 当我使用类ObjectOutputStream和ObjectInputStream以及方法readObject / writeObject时,一切正常。

它模拟与我肯定可以正确解释仅方法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();

            }

谢谢你的时间

IOUtils.toString(InputStream)必须读取流,直到流结束为止,这意味着对等方已断开连接。 所以你不能写它。

如果要与数据流交换字符串,则应使用writeUTF()和readUTF()。

或使用BufferedReader / Writer读写行。

暂无
暂无

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

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