2014-12-29 2 views
1

내가 주소 Resusability을 확인하려면 다음의 코드를 사용하고 새로운 자바 런타임 환경에서 작동하지 않습니다 : -주소 재사용이

import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class CheckBind { 

public static void main(String[] args) { 

    Thread serverThread = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      try 
      { 
       ServerSocket server = new ServerSocket(); 
       server.setReuseAddress(true); 
       server.bind(new InetSocketAddress("127.0.0.1", 2000)); 
       System.out.println("Server Listen: "+server.getLocalSocketAddress()); 

       while(true) 
       { 
        Socket client = server.accept(); 
        System.out.println(""+client.getRemoteSocketAddress()); 
        System.out.println(""+client.getLocalSocketAddress()); 
       } 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 

     } 
    }); 

    serverThread.start(); 

    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    while(true) 
    { 
     Socket client = new Socket(); 
     try 
     { 
      client.setReuseAddress(true); 
      client.bind(new InetSocketAddress("127.0.0.1", 2000)); 
      client.connect(new InetSocketAddress("127.0.0.1",4000)); 
      System.out.println("Client Connect: "+client.getRemoteSocketAddress()); 
      break; 
     } 
     catch (IOException e) 
     { 
     // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 






} 

} 

이것은 Windows 7에서 잘 작동, 64 비트 그리고 JRE 7U5를 사용 [1.7 업데이트 5] 32 비트 버전.

를 [A 서버가 이미 127.0.0.1:4000에서 실행되는 고려]하지만 나는 그것이 JVM_Bind 예외를 제공 JRE 7U60 32 비트 및 JRE 7U72 64 비트에서 확인할 같은 JRE의 새 버전과 동일 할 때. 기본적으로 setReuseAddress (true) OPTION을 사용하는 전체 목적을 무효화합니다.

이 문제를 해결하는 방법에 대한 도움을주십시오.

덕분에 &는 안부

답변

0

setReuseAddress의의 javadoc 말 :

TCP 연결은 연결 후 일정 기간 동안 타임 아웃 상태에 남아있을 수 있습니다 연결을 닫을

가 닫혀 (일반적으로 알려진 TIME_WAIT 상태 또는 2MSL 대기 상태). 잘 알려진 소켓 주소 또는 포트를 사용하는 응용 프로그램의 경우 소켓 주소 또는 포트와 관련된 시간 제한 상태의 연결이있는 경우 필요한 SocketAddress에 소켓을 바인딩 할 수 없습니다.

bind (SocketAddress)를 사용하여 소켓을 바인딩하기 전에 SO_REUSEADDR을 활성화하면 이전 연결이 시간 제한 상태에 있어도 소켓을 바인딩 할 수 있습니다.

하지만이 작업 케이스와 일치하지 않습니다. 다른 소켓이 닫히는 동안 바인드를 시도하지 않습니다. 다른 소켓이 열려있는 동안 실제로 바인딩하려고합니다.


내가 실제로 당신의 테스트가 오래된 JRE에서 실제로 작동했던 이유는 무엇입니까? JVM 버그 일 수도 있습니다 ...

+0

이 기능을 구현하는 방법을 제안 할 수 있습니까? 나는 P2P 채팅 응용 프로그램을 만들고 NAT 변환을 수행하여 다른 NAT 뒤에있는 2 명의 사용자간에 직접 TCP 연결을 만들고 싶습니다. –

+0

나는 그것이 가능하다고 생각하지 않는다. –