Java 使用DataInputStream和DataOutputStream以及套接字的管道破裂
我设置了客户端和服务器套接字。当我使用ObjectOutputStream和ObjectInputStream类以及readObject/writeObject方法时,一切正常 它模拟了一个机器人的通信,我确信这个机器人只会正确地解释这个方法 DataOutputStream.writeBytes 因此,我建立了新的模拟架构,因为机器人无法每天进行测试 在以下代码中,ObjectOutputStream/ObjectInputStream readObject/writeObject替换为DataInputStream/DataOutputStream writeBytes和IOutils.toByteArray。 服务器套接字正确地接收到消息,但当它尝试写回响应时,我得到一个断开的管道,好像连接在某个地方被关闭了。 请注意,我从不关闭套接字或流,因为机器人即使在30秒后也能应答。 如果您能帮助DataOutputStream.writeBytes工作,我们将不胜感激 以下是非工作代码: 客户:Java 使用DataInputStream和DataOutputStream以及套接字的管道破裂,java,sockets,pipe,datainputstream,Java,Sockets,Pipe,Datainputstream,我设置了客户端和服务器套接字。当我使用ObjectOutputStream和ObjectInputStream类以及readObject/writeObject方法时,一切正常 它模拟了一个机器人的通信,我确信这个机器人只会正确地解释这个方法 DataOutputStream.writeBytes 因此,我建立了新的模拟架构,因为机器人无法每天进行测试 在以下代码中,ObjectOutputStream/ObjectInputStream readObject/writeObject替换为Dat
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,有没有办法在我读取流时不关闭它?