2017-02-10 7 views
-2

외부 소켓과 통신하기 위해 Java 소켓 (TCP, 읽기 시간 제한을 30 초로 설정)을 사용하고 있습니다. 서버 데이터는 응용 프로그램 특정 패킷으로 구성된 연속 스트림입니다. 소켓과 관련된 입력 스트림이 0 바이트 값의 데이터를 반환합니다.

그러나 입력 스트림은 바이트 값 0

while (connectionIsValid){ 
final byte[] buffer= new byte[2]; 
in.read(buffer); 
    //Print buffer 
//Log line 
Byte[0] is 0 
Byte[1] is 0 

//POST processing if buffer bytes is not equal to OK. 
//Other wise bypass post processing 
} 

을 나타내는 데이터를 반환 지난 몇 일에서

- 내가 자바 클라이언트 소켓을 알고 생성없이 스트림/소켓 관련 예외와 같은 예외의 logged.And 없다 닫히지 않았거나 시간 초과되었습니다.

그리고 응용 프로그램은 while 루프를 통해 반복됩니다. [업데이트]

private byte[] readWrapper(InputStream stream, int totalLen) throws IOException { 
     byte[] buffer; 
     byte[] bufferingBuffer = new byte[0]; 
     while (totalLen != 0) { 
      buffer = new byte[totalLen]; 
      final int read = stream.read(buffer); 
      if(read==-1 || read==0){ 
       //throw exception 
      } 
      totalLen = totalLen - read; 
      buffer = ArrayUtils.subarray(buffer, 0, read); 
      bufferingBuffer = ArrayUtils.addAll(bufferingBuffer, buffer); 

     } 
     return bufferingBuffer; 
    } 
+1

당신은'read()'에 의해 반환 된 값을 무시하고 있습니다. 따라서 버퍼의 내용에 대해 작성한 결론은 유효하지 않습니다. – EJP

+0

예 read()에 의해 반환 된 값을 확인/로그해야합니다. 그러나 30 초의 읽기 시간을 설정 했으므로 2 바이트를 읽을 때까지 read()가 30 초 동안 블록되지 않습니까? 2 바이트가 실제로 읽힌다 고 가정 할 때 생각하는 과정입니다. – blueSky

+2

아니요. (a) 적어도 하나의 바이트가 전송되거나 (b) 스트림이 끝날 때까지 또는 (c) 예외가 발생할 때까지 차단됩니다. 이것은 모두 Javadoc에 명확하게 명시되어 있습니다. 그것이 버퍼를 채우려 고 시도 할 것이라고 말하는 것은 아무것도 없습니다. – EJP

답변

0

당신은 모든 것을 필요로하지 않습니다. JDK에는 이미하는 방법을 포함

private byte[] readChunkedData(InputStream stream, int size) throws IOException { 
    byte[] buffer = new byte[size]; 
    DataInputStream din = new DataInputStream(stream); 
    din.readFully(buffer); 
    return buffer; 
} 

이 버전의 (a) 작동 (b)는 타사 클래스 및 (c) 스트림에 남아 size 바이트가없는 경우 EOFException 발생을 필요로하지 않습니다 .

+0

이 메서드를 보았습니다. 값이 <= 0. 인 경우 각 read()의 반환 값을 로그하려면 원격 스트림으로 작업하면서 read()가 0을 반환하는지 궁금합니다 (-1 , 스트림이 확실하게 끝났습니다.) 그리고 계속 100 개의 반복을 읽는 것으로 계속 가정 해 봅시다. 데이터를 얻습니다. [link] (http://stackoverflow.com/questions/6160432/java-inputstream-reading-problem) – blueSky

+0

이 게시물을 읽고 Alvin의 의견은 read()가 0을 반환하더라도 더 많은 반복에서 데이터를 가져올 가능성이 있음을 의미합니다. [링크] http://stackoverflow.com/questions/6160432/java-inputstream-reading-problem – blueSky

+0

@Alvin은 완전히 오인됩니다. 'InputStream.read() '에 대한 Javdoc은 적어도 하나의 바이트가 전송되거나 스트림이 끝나거나 예외가 발생할 때까지 블록한다는 것을 분명하게 명시합니다. 0을 반환 할 수있는 유일한 방법은 프로그래밍 오류가 될 수있는 길이가 0 인 버퍼 또는 카운트를 제공하는 경우입니다. 나는 당신에게 작업 코드를 제공했다. 당신이 그것을 시도 할 때 어떻게됩니까? – EJP