2017-05-14 1 views
-2

을 읽는 동안 차단 쓰기. 자바 SocketChannel에 내가 두 개의 서로 다른 스레드에서 동시에 (안드로이드 API 레벨 25)에 <code>SocketChannel.write</code> 및 <code>SocketChannel.read</code>를 사용하는 것을 시도하고있다

나는 모드 차단 로 된 SocketChannel을 구성.
// Make socketChannel.read() return after 500ms at most 
socketChannel.socket().setSoTimeout(500); 
while(!SHUTDOWN) { 
    int read = socketChannel.read(buffer); 
    if(read > 0){ 
     // Do something nice 
     break; 
    } 
} 

그리고 쓰기

, 내가 데이터를 각 10 초 쓰기 :

읽기 위해, 나는 서버에서 모든 것을 읽을 무한 루프를 만들었습니다.

문제는 내가 가끔 발견되는 쓰기 작업이 읽는 동안 차단 된 (I 각 루프에서 짧은 기간, 예를 들어,이 100ms에 대한 읽기 스레드 잠을 한 경우,이 문제는 분명히 나타나지 않습니다).

AFAIK, TCP 연결은 양방향 작업을 동시에 제공 할 수 있습니다. 아무도 이것을 설명 할 수 있습니까?

+0

당신은 완전히'읽기()'메소드에 의해 반환되는 정보를 무시한다. 그러지 마. – EJP

+0

죄송합니다, @EJP는, 이것은 내가 – MrROY

+0

그것을 고정 루프에서 데이터를 읽고 있습니다 그것은 좋은 이유 – MrROY

답변

0

바와 같이 TCP Wikipedia - Flow Control 설명 다음 TCP 수신기가 수신 안정적 프로세스 을하는

TCP는 발신자가 너무 빨리 데이터를 전송하는 것을 피하기 위해 엔드 투 엔드 흐름 제어 프로토콜을 사용한다. 다양한 네트워크 속도의 기계가 통신하는 환경 인 에서는 흐름 제어를위한 메커니즘이 필요합니다. 예를 들어, PC가 데이터를 수신하는 데 천천히 처리하는 스마트 폰으로 데이터를 보내면 스마트 폰은 이 압도 당하지 않도록 데이터 흐름을 조절해야합니다.

+0

감사합니다. 그러나 이것은 왜 독서가 글을 차단하는지 설명하지 않습니다. – MrROY

+0

독자가 너무 느리게 읽을 때 리더가 작성자를 차단합니다. – Aubin

관련 문제