Java 使用DataInputStream和DataOutputStream以及套接字的管道破裂

Java 使用DataInputStream和DataOutputStream以及套接字的管道破裂,java,sockets,pipe,datainputstream,Java,Sockets,Pipe,Datainputstream,我设置了客户端和服务器套接字。当我使用ObjectOutputStream和ObjectInputStream类以及readObject/writeObject方法时,一切正常 它模拟了一个机器人的通信,我确信这个机器人只会正确地解释这个方法 DataOutputStream.writeBytes 因此,我建立了新的模拟架构,因为机器人无法每天进行测试 在以下代码中,ObjectOutputStream/ObjectInputStream readObject/writeObject替换为Dat

我设置了客户端和服务器套接字。当我使用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.toStringInputStream必须读取流,直到其结束,这意味着对等方已断开连接。所以你不能给它写信

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


或者使用BufferedReader/Writer进行读写操作。

我发送消息的机器人似乎只理解dataoutputstream。writebytes,有没有办法在我读取流时不关闭它?