我需要解决这种情况,我已经阅读了很多,但没有找到任何示例或相关文字。我有一个服务器套接字,可从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
}