외부 소켓과 통신하기 위해 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;
}
당신은'read()'에 의해 반환 된 값을 무시하고 있습니다. 따라서 버퍼의 내용에 대해 작성한 결론은 유효하지 않습니다. – EJP
예 read()에 의해 반환 된 값을 확인/로그해야합니다. 그러나 30 초의 읽기 시간을 설정 했으므로 2 바이트를 읽을 때까지 read()가 30 초 동안 블록되지 않습니까? 2 바이트가 실제로 읽힌다 고 가정 할 때 생각하는 과정입니다. – blueSky
아니요. (a) 적어도 하나의 바이트가 전송되거나 (b) 스트림이 끝날 때까지 또는 (c) 예외가 발생할 때까지 차단됩니다. 이것은 모두 Javadoc에 명확하게 명시되어 있습니다. 그것이 버퍼를 채우려 고 시도 할 것이라고 말하는 것은 아무것도 없습니다. – EJP