Im은 TCP를 통해 내 서버에 연결하는 간단한 소켓 앱을 만듭니다. 때때로 2 바이트 값을 읽을 필요가 있습니다. 따라서 다음과 같이됩니다.Java 소켓 - 손실 된 바이트 및 100 % 프로세서 전력 소비량
public byte[] read(int bytes)
{
byte b[] = new byte[bytes];
try {
in.read(b); //in is InputStream from properly connected Socket.getInputStream()
return b;
} catch (IOException e) {
return null;
}
}
이 함수는 주어진 바이트 수를 받아서 배열로 반환해야합니다. 문제는 가끔 휴식을 취하기 전에 1 바이트를 읽고 이상한 데이터를 반환한다는 것입니다. (실제로, 하나 개의 코어)
public byte[] read(int bytes)
{
byte b[] = new byte[bytes];
try {
while (in.available()<bytes); //It does the thing
in.read(b);
return b;
} catch (IOException e) {
return null;
}
}
을하지만 루프는 프로세서 전력의 100 %를 사용하고 있습니다 인 :이 충분한 데이터를 읽을 경우
byte a[]=read(2); //Program is blocked here untill some bytes arrive...
System.out.prntln(a[0]); //always correct
System.out.prntln(a[1]); //unprintable character (probably 0 or -1)
내 빠른 수정은 루프를 확인하면서 추가했다 매우 짜증나. 해당 함수를 다시 쓰는 방법이 있습니까 (param과 반환 값이 정확히 같아야합니다). 그러면 올바르게 작동합니까?
고맙습니다 :
여기 왜이 작업을 수행해야합니까? 나는 마침내 {}와 내 문제 사이에 어떤 현실도 찾을 수 없다. 내가 틀린가? –
예를 들어 열 때 리소스를 닫아야한다는 의견이 있습니다. InputStreams – nachokk
더 이상 InputStream을 필요로하지 않을 때 닫습니다. 이는 단지 도우미 기능 일뿐입니다. 또한 소켓이있을 때 스트림이 자동으로 닫히지 않습니까? –