찾다

 >  Q&A  >  본문

java socket read 阻塞问题???

自己写了一个小的服务器代码,从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循环的方法,会被阻塞。
求解啊!!

PHPzPHPz2889일 전416

모든 응답(4)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-17 17:49:23

    다음은 Java API 문서의 읽기 메소드 설명입니다.

    이 방법은 입력 데이터를 사용할 수 있거나 파일 끝이 감지되거나 예외가 발생할 때까지 차단됩니다.

    새 데이터를 읽을 수 없으면 읽기가 차단된다는 의미입니다.

    읽는 동안 클라이언트가 데이터를 보내면 읽기는 차단되지 않고 클라이언트가 배열로 보낸 데이터를 읽습니다. 클라이언트가 데이터를 보내지 않는 두 번째 시간까지 루프가 계속됩니다. 그런 다음 서버가 데이터를 읽을 수 없으면 클라이언트의 데이터를 계속 기다리게 되어 차단됩니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 17:49:23

    다 막히겠지만 한 번만 읽어도 별 느낌이 없을 거예요. while의 사용은 처리 방법에 따라 다릅니다. 일반적으로 while는 무제한 읽기에 사용되며 이는 监听连接의 효과입니다. 모니터링 및 읽기에서는 일부 전송 프로토콜이 작성되고 단일 메시지의 끝점이 전송 프로토콜을 통해 결정됩니다. 끝점을 읽으면 처리를 위해 처리기에 제출됩니다. read을 사용하여 읽을 때 내용이 자동으로 단일 메시지로 분할되지 않고 모든 내용이 연속해서 읽혀지기 때문에 상대방이 메시지를 보내지 않는 한 여기서는 차단됩니다.

    회신하다
    0
  • 迷茫

    迷茫2017-04-17 17:49:23

    애초에 차단이 되어있는데, 차단 후 직접 스레드를 생성해서 읽어온 데이터를 스레드에 넣는 것이 좋습니다. 스레드가 처리하도록 하여 여러 요청을 요청할 수 있습니다.

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:49:23

    핵심은 다음과 같습니다. while((len = in.read(buffer)) != -1), 소켓이 닫히지 않는 한 이 while은 종료되지 않으며 위 코드는 내용을 읽기만 합니다. buffer.이므로 버퍼 크기를 읽은 후 read 메소드가 반환됩니다. 두 프로그램은 읽기가 불가능하고 소켓이 닫히지 않으면 차단되기 때문에 차단과 관련이 없습니다.

    회신하다
    0
  • 취소회신하다