我需要解决这种情况,我已经阅读了很多,但没有找到任何示例或相关文字。我有一个服务器套接字,可从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具有正确的信息,但是我需要确定何时对流进行放气,何时对不放气,因此我可以对每种情况应用正确的代码,这就是我的要求。这里有大问题!

最佳答案

您可以将客户端套接字输入流包装为BufferedInputStream,然后将缓冲的流包装为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
}

10-06 06:23