当前位置: 首页 > 知识库问答 >
问题:

使用DataInputStream和DataOutputStream以及套接字的中断管道

禄俊逸
2023-03-14

我设置了客户端和服务器套接字。当我使用类ObjectOutputStream和ObjectInputStream以及ReadObject/WriteObject方法时,一切都运行良好。

它模拟了与机器人的通信,我确信机器人只正确解释方法DataOutputStream.WriteBytes。

所以我建立了一个新的体系结构来进行模拟,因为机器人不能每天进行测试。

在下面的代码中,ObjectOutputStream/ObjectInputStream ReadObject/WriteObject被替换为DataInputStream/DataOutputStreamWriteBytes和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个答案

戎永福
2023-03-14

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

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

或读写行。

 类似资料:
  • 本文向大家介绍java DataInputStream和DataOutputStream详解及实例代码,包括了java DataInputStream和DataOutputStream详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 java DataInputStream和DataOutputStream详解 操作基本数据类型的流  DataInputStream DataOutputSt

  • 问题内容: 检测插座是否已掉落的最合适方法是什么?还是实际上是否发送过数据包? 我有一个库,用于通过Apple网关(在GitHub上提供)将Apple Push Notifications发送到iPhone 。客户端需要打开一个套接字并发送每个消息的二进制表示形式。但不幸的是,Apple不会返回任何确认。该连接也可以重用于发送多个消息。我正在使用简单的Java套接字连接。相关代码为: 在某些情况下

  • 问题内容: 我正在尝试使用套接字与服务器建立连接。连接管道损坏,如下所示。 这是代码,在此行上引发异常。 注意:如果我关闭套接字连接,立即可以正常工作。但是我想保持连接仍然活跃,所以我手动关闭套接字连接。停止按钮的onclick我正在关闭连接。 我在网上搜索,但没有找到解决此问题的方法。 问题答案: 在您写入连接时,对等方关闭了连接。这通常意味着您发送了一些它不理解的内容。也许是HTTP服务器?还

  • 让我解释一下我的问题。 我想重写Socket和ServerSocket类,以便以这种方式加密我的消息: 1)客户端向服务器发送随机生成的对称密钥(AES算法) 2)之后,客户端和服务器可以3)为了交换对称密钥,客户端使用服务器的公钥对其进行加密(RSA算法) 我覆盖了Socket和ServerSocket,所以当客户端打开一个套接字时,它会自动发送由服务器公钥加密的对称密钥。服务器读取流中的前12

  • 我按照http://spring.io/guides/gs/consulting-rest/使用rest服务。本教程只提到一个单层JSON文件。但是,我希望解析一个json 当我通过spring-boot run运行该命令时,我在命令行中得到以下结果: 有什么我没看到的吗?

  • 我正在开发一个通过TCP/IP承载第三方设备的服务器,并且已经经历了突然的连接中断(设备通过蜂窝连接)。我需要找到一种方法来检测断开,而不必将数据写入设备本身。 我的简化套接字代码如下: 如有任何反馈,将不胜感激。