如何读取 DataInputStream 两次或两次以上



我有一个套接字连接到我在其他地方托管的应用程序。连接后,我做了一个OutputStreamDataInputStream

建立连接后,我使用OutputStream向应用程序发送握手数据包。一旦此握手获得批准,它将通过DataInputStream (1) 返回数据包。

此数据包将进行处理,并随 OutputStream 一起返回到应用程序。

如果此返回的数据有效,我将从DataInputStream (2) 收到另一个数据包。但是,我无法通过DataInputStream读取此数据包。

我尝试使用DataInputStream.markSupported()DataInputStream.mark()但这没有给我任何东西(除了一条空的异常消息)。

是否可以第二次读取输入流?如果是这样,有人可以指出我在这里做错了什么吗?

编辑:这是我的解决方案:

// First define the Output and Input streams.
OutputStream output = socket.getOutputStream();
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
// Send the first packet to the application.
output.write("test"); // (not actual data that I sent)
// Make an empty byte array and fill it with the first response from the application.
byte[] incoming = new byte[200];
bis.read(incoming); //First packet receive
//Send a second packet to the application.
output.write("test2"); // (not actual data that I sent)
// Mark the Input stream to the length of the first response and reset the stream.
bis.mark(incoming.length);
bis.reset();
// Create a second empty byte array and fill it with the second response from the application.
byte[] incoming2 = new byte[200];
bis.read(incoming2);

不确定这是否是最正确的方法,但这种方式对我有用。

我会使用ByteArrayInput流或你可以重置的东西。 这将涉及将数据读取到另一种类型的输入流中,然后创建一个输入流。

InputStream 有一个markSupported()方法,您可以检查原始和字节数组,以找到标记将要使用的方法:

https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#markSupported()https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html

这里的问题不是重新读取输入。我在问题中没有看到任何需要您阅读两次输入的内容。问题是BufferedInputStream,它将读取所有可供阅读的内容,包括第二条消息(如果它已经到达)。

解决方案是在完成握手之前不使用缓冲流。只需在套接字输入流上发出读取第一条消息的确切长度,进行握手,然后继续构造和读取缓冲流。

相关内容

  • 没有找到相关文章

最新更新