我有一个套接字连接到我在其他地方托管的应用程序。连接后,我做了一个OutputStream
并DataInputStream
。
建立连接后,我使用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,
它将读取所有可供阅读的内容,包括第二条消息(如果它已经到达)。
解决方案是在完成握手之前不使用缓冲流。只需在套接字输入流上发出读取第一条消息的确切长度,进行握手,然后继续构造和读取缓冲流。