2013-03-07 7 views
3

논 블로킹 읽기와 블로킹 읽기의 차이는 분명하지만 쓰기에 대해서는 혼란 스럽다. 차단되지 않는 쓰기가 결코 차단되지 않는다는 것을 이해합니다 (예!). 기본 소켓 버퍼가 꽉 찼 으면 바이트는 단순히 소켓 버퍼에 쓰여지지 않습니다. 그래서 channel.write를 호출 할 때 작성된 바이트 수를 확인하는 것이 중요합니다.Java에서 블로킹 소켓 쓰기와 비 블로킹 소켓 쓰기의 차이점은 무엇입니까?

지금 대략 차단하는 방법에 대해을 작성 하시겠습니까? 언제 차단됩니까? 플러시를 부를 때? 그 OutputStream에 write를 호출하면? 기본 쓰기 소켓 버퍼에 공간이 생길 때까지 차단됩니까? 아니면 쓸 수 없다면 예외를 던지나요?

+0

http://stackoverflow.com/questions/8086930/non-blocking-socket-writes-in-java-versus-blocking-socket-writes – yadab

+0

또한 비동기 쓰기가 있습니다. – irreputable

+0

@irreputable async write is not 블로킹 필자는 생각했다. – chrisapotek

답변

2

예, 바이트를 복사 할 기본 OS 소켓 전송 버퍼에 충분한 공간이있을 때까지 차단됩니다. 소켓에 연결된 OutputStream Java 데이터에 데이터를 입력하는 경우 또는 flush() 중 어느 것이 든 호출 할 때 발생할 수 있습니다. 실제 write(2) 시스템 호출

+0

Humm, 그래서 flush()에 대한 호출이 영원히 오래 걸릴지를 알 수있는 방법이 없습니까? 그게 짜증 난다 ... 문제는 소켓에 읽기를 차단하는 동안 비 블로킹을 쓰게하는 방법이 없다는 것입니다. – chrisapotek

+0

아니요, 둘 다 단일 바이너리 스위치입니다. –