2013-07-12 5 views
-1

소켓을 사용하는 클라이언트/서버 프로그램이 있습니다. 내가 Socket incoming=s.accept();가 ~ 450ms 걸리는 것으로 나타났다자바에서 소켓 연결 시간을 줄이는 방법은 무엇입니까?

long start= System.CurrentTimeMillis();  
Socket incoming=s.accept(); 
long end= System.CurrentTimeMillis(); 
System.out.println(end-start); 

: 서버 측에 나는 내가 같은 시간을 측정

Socket s=new Socket("172.17.20.47", 8888);  
ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream()); 
ObjectInputStream ios = new ObjectInputStream(s.getInputStream()); 
s.close(); 
oos.close(); 
ios.close(); 

가 클라이언트 측에

ServerSocket s=new ServerSocket(8888); 
s.setSoTimeout(10000); 
Socket incoming=s.accept(); 
ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream()); 
ObjectInputStream ios = new ObjectInputStream(s.getInputStream()); 
s.close(); 
oos.close(); 
ios.close(); 
incoming.close(); 

있습니다. 어떻게 시간을 단축 할 수 있습니까? 코드의 나머지 부분은 ~ 15ms가 걸리기 때문입니다. 컴퓨터 사이

핑이에 < 1ms의

+4

'accept()'는 요청이있을 때까지 차단됩니다. 따라서 시간 측정은 정확하지 않습니다. –

답변

0

대답은 Eng.Fouad의 코멘트를 읽는 것입니다. ServerSocket 클래스의 accept 함수는 들어오는 요청이 오기를 기다립니다. 클라이언트 코드를 시작하기 전에 5 시간을 기다린 경우 accept 함수가 18000000ms 걸릴 것입니다 !! 그 기능을 더 빨리 할 수는 없지만, 가능한 빨리 할 수 ​​있습니다.

(농담 : 당신이 빠르게 클라이언트를 시작으로 accept 함수의 시간을 줄일 수 있습니다 ..) :

당신이 동의 기능 (정말 '하지 않음) 너무 많은 시간이 걸릴 이유를 이해 바랍니다.

+0

하지만 서버와 동시에 클라이언트를 시작하고 연결하기 전에 같은 양의 계산을 수행하고 있다는 점이 –

+1

입니다. accept()가 얼마나 오래 걸리는지는 중요하지 않습니다. 당신이 측정하는 것은 '동시에'의 진정한 의미입니다. 측정해야 할 것은 클라이언트에 연결하는 시간입니다. – EJP

관련 문제