2

我需要并处理这种情况,我已经阅读了很多,但我没有找到任何关于它的示例或文本。我有一个服务器套接字,它接收来自 2 个客户端的数据:a)来自发送泄气流的客户端。b) 从发送 ASCII 流的客户端。

a) 接收放气流:

inflater = new InflaterInputStream(clientSocket.getInputStream());
bout = new ByteArrayOutputStream(3025);
int b;
while ((b = inflater.read()) != -1) {
    bout.write(b);
}
strMessage = new String(bout.toByteArray());

b) 从 ASCII 流接收:

bufferEnt = new char[3025];
Arrays.fill(bufferEnt,' ');
input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
intLongBuffer = input.read(bufferEnt);
strMessage = new String(bufferEnt).trim();

在每种情况下,此代码都可以正常工作,并且变量strMessage具有正确的信息,但是我需要确定流何时放气,何时放气,因此我可以将正确的代码应用于每种情况,这是我的大问题!

4

2 回答 2

1

您可以将客户端套接字输入流包装成 a BufferedInputStream,然后将缓冲流包装成 a InflaterInputStream,然后尝试从充气流中读取。如果出现错误,则忘记充气流,倒回缓冲流,然后直接从缓冲流中读取。您必须使用缓冲流的mark()reset()函数来倒带流,并且您可能必须尝试mark()找出要传递给它的值。类似于以下内容:

BufferedInputStream bis = new BufferedInputStream(clientSocket.getInputStream());
bis.mark(1024); // experiment to find the correct value here
InflaterInputStream iis = new InflaterInputStream(bis);
try {
    ... // Process the inflated stream
} catch (ZipException ze) {
    // It is not a ZIP stream. Try to process as text
    bis.reset();
    ... // Process the text stream
}
于 2013-04-16T16:28:28.527 回答
0

您可以将字节读入缓冲区,然后尝试膨胀它们

InflaterInputStream iis = new InflaterInputStream(new ByteArrayInputStream(buf));
...

如果它不是一个放气的流,你会得到一个异常,然后保持字节不变

于 2013-04-16T15:17:58.800 回答