2012-07-13 4 views
0

누군가가 내게 설명해 줄 수있는 이유는 in.available()> 0이 제대로 작동하는 이유입니다.하지만 주석을 달았습니다. 더 구체적으로BufferedInputStream은 사용할 수는 없지만 어쨌든 작동합니다.

mySocket = new Socket("blahblah", 12345); 
BufferedInputStream in = new BufferedInputStream(mySocket.getInputStream()); 
.... 
char result[] = new char[length];  
for (int i = 0; i < length && !mySocket.isClosed() /*&& in.available()>0*/; i++){ 
    result[i] = (char)in.read(); 
} 

: 나는 사용자가 용어를 검색 할 수있는 안드로이드 응용 프로그램을 만들고있어, 해당 검색이 공간의 일부 꼬추로 전송됩니다, 나는 XML 형태로 결과를 다시 얻을, 그들과 함께 물건을 할. 반환되는 XML이 충분히 작을 때 (위의 코드에서 길이 참조), 코드는 in.available()> 0을 그대로 유지하면서 정상적으로 작동하지만 길이가 클 경우 in.available()은 0을 반환합니다. 그러나 주석을 달아 모든 것이 원활하게 진행됩니다.

왜 그럴까요? 그리고 내가 걱정하고 고칠 필요가있는 것이 있습니까?

+0

isClosed() 테스트도 제거해야합니다. 그것은 당신이 생각하는 것을하지 않습니다 : 당신이 소켓을 직접 닫았는지 여부 만 알려줍니다. EOS 테스트가 아닙니다. -1을 반환하는 read()는이를 알려줍니다. 소켓을 직접 닫은 경우 처음부터이 코드 근처에 있으면 안됩니다. – EJP

답변

1

데이터가 크면 in.available() == 0 이유는 아직 소켓에 쓸 기회가 없었기 때문이라고 생각합니다. in.available()을 사용할 필요가 없습니다. 또한 한 번에 하나의 문자를 읽는 것이 좋지는 않을 것입니다. 네트워크를 통해 많은 데이터와 채팅이 매우 느릴 것입니다. 크기 "length"의 바이트 배열을 읽는 것을 고려하십시오.

2

in.available()은 차단하지 않고 그 순간에 데이터를 읽을 수 있는지 알려줍니다. 소켓에는 데이터 스트림이 있으므로 즉시 사용할 수는 없지만 짧은 시간에 사용할 수 있습니다. 예 : 1 기가비트 연결을 사용하는 경우 전체 패킷은 컴퓨터에 오랜 시간 동안 15 마이크로 초 가까이 있지 않습니다.

관련 문제