2010-12-29 4 views
2

내 프로그램이 종료되기 전에 ServerSocket.close() 및/또는 Socket.close()을 실행하지 않으면 다음 번에 프로그램을 시작할 때 포트에서 수신 대기를 시도 할 때 항상 IOException이됩니다.ServerSocket 닫기를 잊어 버림

이것은 대개 프로그램을 종료 할 때 close()을 넣는 것을 잊었 기 때문에 발생하는 것이 아니며, 프로그램을 강제로 닫을 때 close()을 실행하지 못할 수도 있습니다. "점유 된 소켓"을 없애기 위해 내 Linux 컴퓨터에서 로그 아웃하고 로그인해야하는 것처럼 보입니다. 서버가 터미널이나 다른 방법으로 강제 종료 된 경우 닫히지 않은 소켓을 정리할 수있는 방법을 아는 사람이 있는지 궁금합니다.

이미 내 네트워크 연결을 사용하지 않도록 설정하고 사용하도록 설정했으나 여전히 운이 좋았습니다.

+0

어떻게 프로세스를 죽입니까? kill -9로? – Cratylus

+0

죄송합니다. 정확한 문제는 현재 명확하지 않습니다. 질문에서, 당신은 당신이 "프로그램을 강제로 닫는다"는 말을했지만, 내 대답에 대한 언급에서 당신은 프로그램 자체가 충돌하는 것에 대해 걱정한다고 언급했다. 어떤 시나리오가 걱정 되십니까? 둘 다? –

답변

5

귀하의 믿음과 달리 귀하는 귀하의 프로그램을 종료하지 않습니다. 만약 yould가 있었다면, 소켓은 해제되었을 것이고, 나는 당신이 리눅스 커널에서 버그를 발견했다는 것을 믿지 않는다 :).

주 스레드가 종료되었지만 응용 프로그램에 여전히 비 데몬 스레드가 실행되어 JVM을 활성 상태로 유지할 수 있습니다.

스레드를 만든 후에는 myThread.setDaemon (true)을 호출해야합니다.

+0

그 의견은 돈에 맞습니다 :) – bestsss

-2

sudo는 경우/sbin/서비스 네트워크를 다시 시작

0

당신은 그것을 결합하기 전에 ServerSocket의에 [setReuseAddress()][1]를 호출하고 있습니까? 그렇지 않다면 시도해보십시오.

+0

그게 무슨 뜻이야? 내 프로그램은 ServerSocket을 이렇게 시작합니다 ... ServerSocket serverSocket = new ServerSocket (1234); 연결을 대기합니다. socket socket = serverSocket.accept(). 나는 무엇을 추가 할까? – Brian

+0

@AeroDroid'new ServerSocket()'을 사용하여 언 바운드 서버 소켓을 만들고, 그 다음에'setReuseAddress (true)'를 호출 한 다음'bind()'메소드 중 하나를 호출하여 주소에 바인드하십시오. –

-2

/etc/init.d/networking restart

0

사용을 "에서 netstat -a"명령은 해당 포트의 상태를 확인합니다. 나는 그것이 클로즈 - 웨이트에있을 것이라고 생각한다. 이것은 설계된대로 작동하는 TCP의 경우이며 모든 언어와 OS로 표시됩니다. 결국 커널은 당신의 프로그램이 소켓을 닫고 그것을 지우기를 기다리는 시간 초과가 될 것이다. 이 시간 제한을 줄일 수 있지만 가장 좋은 해결책은 프로그램이 완전히 종료되는지 확인하는 것입니다.

+0

@JTON :하지만 일단 프로세스가 종료되면 소켓 fd가 즉시 릴리스되지 않습니까?즉시 소켓을 재사용 할 수 없다는 의견에 대해서도 맞습니다.하지만 왜 그들이 가까이서 기다리고 있을까요? – Cratylus

+0

당신이 옳다고 생각합니다. 나는 그것이 TIME-WAIT이고 CLOSE-WAIT이 아닐 것이라고 확신한다. 이 문제를 다 겪은 지 꽤 오래되었습니다. – JOTN

+0

@JTON : 프로세스가 스레드를 생성했으나 강제 종료되지 않은 경우 프로세스가 백그라운드에서 실행 중이고 fd가 아직 보유되어있을 수 있습니까? – Cratylus

0

JVM이 예기치 않게 중단 될 경우 어떤 일이 일어날 지 염려되기 때문에 내 생각에 필요한 것은 종료 후크입니다. 다음 링크를 확인하십시오. http://www.devx.com/getHelpOn/10MinuteSolution/20459/1954

+0

와우, 정확히 내 시나리오처럼 들리네, 고마워! – Brian

+0

Nope. 그렇지 않다. 종료 후크는 전혀 도움이되지 않습니다. 첫째, 프로세스가 정상적으로 종료 된 경우에만 실행됩니다 (kill -TERM/9)는 후크를 실행하지 않습니다. 프로세스가 정상적으로 종료되면 소켓 FD가 올바르게 해제됩니다. – bestsss

+0

예, 저는 여러분에게 bestsss에 동의합니다. Shutdown Hooks는 안전하게 종료 할 때만 실행된다는 것을 알았습니다. 나는 실제로이 문제를 직접 해결했다고 생각합니다. – Brian

0

"프로그램"이란 무엇입니까? 프로세스를 소유하고 있거나 컨테이너에 꽂기위한 모듈 일뿐입니다. 프로세스를 종료하면 해당 프로세스와 관련된 모든 소켓이 닫히기 때문에 명시 적으로 close() 할 필요가 없으며 적어도 java.net.BindException을 방지 할 필요는 없습니다.

프로그램이 실제로 실행을 종료했는지 확인해 주시겠습니까?

관련 문제