自己写了一个小的服务器代码,从socket中读取数据时,用读一次的方式就不会阻塞,而放在while里面就会阻塞为什么呢?如果read是阻塞的,那么即使是读一次也因该会被阻塞啊?
代码如下:
in.read(buffer);
for(byte b : buffer)
request.append((char)b);
这是读一次的方法,不会阻塞。
while((len = in.read(buffer)) != -1){
for(byte b : buffer){
request.append((char)b);
}
这是while循环的方法,会被阻塞。
求解啊!!
PHP中文网2017-04-17 17:49:23
다음은 Java API 문서의 읽기 메소드 설명입니다.
이 방법은 입력 데이터를 사용할 수 있거나 파일 끝이 감지되거나 예외가 발생할 때까지 차단됩니다.
새 데이터를 읽을 수 없으면 읽기가 차단된다는 의미입니다.
읽는 동안 클라이언트가 데이터를 보내면 읽기는 차단되지 않고 클라이언트가 배열로 보낸 데이터를 읽습니다. 클라이언트가 데이터를 보내지 않는 두 번째 시간까지 루프가 계속됩니다. 그런 다음 서버가 데이터를 읽을 수 없으면 클라이언트의 데이터를 계속 기다리게 되어 차단됩니다.
PHP中文网2017-04-17 17:49:23
다 막히겠지만 한 번만 읽어도 별 느낌이 없을 거예요. while
의 사용은 처리 방법에 따라 다릅니다. 일반적으로 while
는 무제한 읽기에 사용되며 이는 监听连接
의 효과입니다. 모니터링 및 읽기에서는 일부 전송 프로토콜이 작성되고 단일 메시지의 끝점이 전송 프로토콜을 통해 결정됩니다. 끝점을 읽으면 처리를 위해 처리기에 제출됩니다. read
을 사용하여 읽을 때 내용이 자동으로 단일 메시지로 분할되지 않고 모든 내용이 연속해서 읽혀지기 때문에 상대방이 메시지를 보내지 않는 한 여기서는 차단됩니다.
迷茫2017-04-17 17:49:23
애초에 차단이 되어있는데, 차단 후 직접 스레드를 생성해서 읽어온 데이터를 스레드에 넣는 것이 좋습니다. 스레드가 처리하도록 하여 여러 요청을 요청할 수 있습니다.
天蓬老师2017-04-17 17:49:23
핵심은 다음과 같습니다. while((len = in.read(buffer)) != -1), 소켓이 닫히지 않는 한 이 while은 종료되지 않으며 위 코드는 내용을 읽기만 합니다. buffer.이므로 버퍼 크기를 읽은 후 read 메소드가 반환됩니다. 두 프로그램은 읽기가 불가능하고 소켓이 닫히지 않으면 차단되기 때문에 차단과 관련이 없습니다.