:Java에서 소켓을 사용하여 빠른 데이터 읽기를 만드는 방법은 무엇입니까?
int sampleBufferSize = 50;
StringBuilder data = new StringBuilder();
ByteBuffer bf = ByteBuffer.allocate(sampleBufferSize);
SocketChannel sc = new SocketChannel();
while(true)
if(sc.read(bf) > 0){
bf.flip();
while(bf.hasRemaining())
data.append((char) bf.get());
bf.clear();
}else{
fireDataReceived(data.toString());
data.delete(0, data.length());
}
이 코드는 매우 효율적 아니지만, 그것은 0.05 초에서 같은 PC에서의 HTTP POST 요청 1백30킬로바이트를 읽습니다. 이제 비슷한 기능을하지만 Socket을 사용하여 클래스를 작성하려고합니다. 여기에 코드입니다 :
private static final int TIMEOUT_MILLIS = 50;
private boolean reading = false;
private long readBeginTime = 0;
private StringBuilder buffer = new StringBuilder();
private Thread thread = new Thread(){
public void run(){
while(!isInterrupted()){
try {
int b = getInputStream().read();
if(b == -1){
if(reading)
fireDataReceived();
close();
}else{
if(!reading){
reading = true;
readBeginTime = System.currentTimeMillis();
setSoTimeout(TIMEOUT_MILLIS);
}
buffer.append((char) b);
}
} catch (SocketTimeoutException e){
fireDataReceived();
} catch (IOException e) {
e.printStackTrace();
if(reading)
fireDataReceived();
close();
}
}
}
};
private void fireDataReceived(){
BufferedSocketEvent e = new BufferedSocketEvent(this, System.currentTimeMillis() - readBeginTime, buffer.toString());
buffer.setLength(0);
reading = false;
try {
setSoTimeout(0);
} catch (SocketException e1) {
e1.printStackTrace();
}
for(BufferedSocketListener listener: listeners)
listener.dataReceived(e);
}
그리고 문제는이 같은 요청에 대해 0.4 초 걸린다 내가 그렇게 오랜 시간이 걸리지 않는 이유를 모르겠어요. 제 코드에 무엇이 잘못된 지 설명하십시오.
'TIMEOUT_MILLIS = 50' 왜이 시간 제한이 너무 작 :
I는 다음과 같이 시작하는 것? 인터넷을 통해 50ms의 지연이있는 것은 드문 일이 아닙니다. –
@Banthar, 그 예입니다. 나는 1 대의 PC 범위에서 그것을 테스트했다. localhost는 거대한 시간 초과입니다. –
30 초로 설정하면 프로그램이 느리게 작동합니까? –