2013-04-16 3 views
2

이 상황이 필요하고 접근하고 있습니다. 많은 것을 읽었으며 이에 대한 예제 나 텍스트를 찾지 못했습니다. 나는 2 개의 클라이언트로부터 데이터를받는 하나의 서버 소켓을 가지고있다 : a) 수축 된 스트림을 보내는 클라이언트로부터. 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 정확한 정보를 가지고

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 스트림으로부터 수신 :

A)는 스트림 수축 받기 하지만 스트림이 수축되었을 때와 언제 그렇지 않은지를 확인해야하므로 각 케이스에 올바른 코드를 적용 할 수 있습니다. 이것이 바로 제가 겪은 큰 문제입니다! 당신이 예외를 얻을 것이다 수축 스트림이 아닌 경우

+0

클라이언트를 제어합니까? 그렇다면 스트림 데이터 유형을 나타내는 헤더 값을 추가하십시오. – jtahlborn

답변

0

당신은 버퍼에 바이트를 읽을 수 있습니다, 다음

+0

은 스트림에서 바이트를 소비 할 수 있습니다. – jtahlborn

1

당신은 할 수 있습니다으로 다음 바이트를두고, 그들에게

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

을 팽창하려고 클라이언트 소켓 입력 스트림을 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 
} 
+0

대단히 감사합니다.이 솔루션은 완벽하게 작동합니다. – user2286970

관련 문제