2012-10-08 2 views
1

나는 LAN 게임을 구현하고 동일한 컴퓨터에서 다음과 같이 테스트합니다. 클래스를 만들고이 클래스의 다른 스레드에 서버와 클라이언트를 만들고 함께 연결합니다.Java 소켓 : java.net.BindException을 방지하는 방법

두 창 (클라이언트 및 서버)을 닫은 후 위의 단계를 다시 수행하면 Java 클래스가 실행되고 서버와 클라이언트가 만들어집니다. 나는 항상이 오류를 만난다 : java.net.BindException (이 포트는 전에 만들어졌고 아직 닫혀 있지 않기 때문에).

서버 소켓을 만들 때마다 캐치에서 항상 serverSocket.close()을 넣습니다. 그러나 그 오류는 여전히 나와 만났다. 이것을 막기위한 아이디어를 좀주세요.

@ : 하나의 포트가 생성되었다는 것을 알고 있다면 닫고 새 포트를 만들 수 있습니까?

감사합니다 :)

답변

2

예외가 catch되지 않으면 catch 블록에있는 내용이 실행되지 않습니다. 대신, finally 블록에 close() 호출을 넣어 항상 실행되도록하십시오.

2

당신은 serverSocket.close을 넣어한다()에 마지막으로 차단하고 어쩌면 다시 그 주소에 결합하기 전에 몇 초를 기다립니다.

0

채널에서 close()을 호출 한 후 충분하지 않을 수 있습니다. 여기에 설명 참조 : http://hea-www.harvard.edu/~fine/Tech/addrinuse.html TCP 연결이 CLOSE-WAIT 또는 TIME-WAIT 상태로 유지 될 수 있습니다. 주소 (SO_REUSEADDR)를 다시 사용하여 재생할 수는 있지만 작동하지 않습니다. 네트워크 수준에서 CLOSE-WAIT 또는 TIME-WAIT에 대해 설정된 시간 초과를 정확히 기다리는 것이 가장 좋습니다.