首页 文章

使用DataInputStream和DataOutputStream以及套接字的管道损坏

提问于
浏览
1

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

它模拟与机器人的通信,我知道肯定只能解释方法DataOutputStream.writeBytes .

因此,我 Build 了新的仿真架构,因为机器人不能每天进行测试 .

在下面的代码中,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();

            }

谢谢你的时间

1 回答

  • 0

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

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

    或者使用BufferedReader / Writer读写行 .

相关问题