2008-09-19 1 views
2
  • 나는 그때 내가 "에서 netstat -a"를 확인하고 포트 9000는 것을 알
  • Ctrl-C를 내 응용 프로그램을 종료 9000
  • 포트를 사용하여 부두 서버를 사용하여 내 응용 프로그램을 시작 더 이상 사용되지 않습니다.
  • 내 응용 프로그램을 다시 시작하고 얻을 :
[ERROR,9/19 15:31:08] java.net.BindException: Only one usage of each socket address (protocol/network address/port) is normally permitted 
[TRACE,9/19 15:31:08] java.net.BindException: Only one usage of each socket address (protocol/network address/port) is normally permitted 
[TRACE,9/19 15:31:08]  at java.net.PlainSocketImpl.convertSocketExceptionToIOException(PlainSocketImpl.java:75) 

[TRACE,9/19 15:31:08]  at sun.nio.ch.Net.bind(Net.java:101) 
[TRACE,9/19 15:31:08]  at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:126) 
[TRACE,9/19 15:31:08]  at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:77) 
[TRACE,9/19 15:31:08]  at org.mortbay.jetty.nio.BlockingChannelConnector.open(BlockingChannelConnector.java:73) 

[TRACE,9/19 15:31:08]  at org.mortbay.jetty.AbstractConnector.doStart(AbstractConnector.java:285) 
[TRACE,9/19 15:31:08]  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40) 
[TRACE,9/19 15:31:08]  at org.mortbay.jetty.Server.doStart(Server.java:233) 
[TRACE,9/19 15:31:08]  at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40) 
[TRACE,9/19 15:31:08]  at ... 

이 자바 버그인가? Jetty 서버를 시작하기 전에 어떻게 든 피할 수 있습니까?netstat이 다른 것을 말하면 "java.net.BindException : 각 소켓 주소를 한 번만 사용"하는 이유는 무엇입니까?

connector.setReuseAddress(true); 
    connector.setPort(port); 
    connector.setStatsOn(true); 
    connector.setMaxIdleTime(30000); 
    connector.setLowResourceMaxIdleTime(30000); 
    connector.setAcceptQueueSize(maxRequests); 
    connector.setName("Blocking-IO Connector, bound to host " + connector.getHost()); 

그것이 유휴 시간 함께 할 수있는 뭔가를 할 수 :

편집 # 1 다음은 "(참) setReuseAddress를"주의, 우리 BlockingChannelConnector을 만들기위한 우리의 코드는?

편집 # 2 퍼즐의 다음 부분 : 디버그 모드 (Eclipse)에서 응용 프로그램을 실행할 때 문제없이 서버가 시작됩니다 !!! 그러나 위에서 설명한 문제는 응용 프로그램을 실행 모드로 실행하거나 빌드 된 jar 파일로 재현 가능하게 발생합니다. 위스키 탱고 폭스 트롯?

편집 # 3 (4 일 후) - 여전히 문제가 있습니다. 이견있는 사람?

+0

컴퓨터에 여러 인터페이스가 있습니까? 그렇다면 어떤 인터페이스에 바인딩되어 있으며 어떤 인터페이스에 netstat가 실행되고 있습니까? – freespace

답변

1

소켓 개체에서 bind()을 호출하기 전에 setReuseAddress(true)으로 전화 할 수도 있습니다. 이는 소켓이 닫힌 후에도 TCP 연결이 지속되어 발생합니다.

+0

우리는 BlockingChannelConnector에서이를 호출합니다. 편집 된 질문 – Epaga

0

부두가 확실하지 않지만 Tomcat이 일부 Linux 서버에서 정상적으로 종료되지 않는 경우가 있습니다. 그런 경우 Tomcat은 다시 시작되지만 이전 인스턴스가 여전히 바인딩되어 있으므로 해당 포트를 사용할 수 없습니다. 그런 경우 Tomcat을 재시작하기 전에 불량 프로세스를 찾아서 명시 적으로 kill -9 해줘야합니다. 이 자바 버그 또는 Tomcat 또는 우리가 사용하는 JVM 특정 있는지 확실하지 않습니다.

+0

Ctrl-C로 프로세스를 닫은 후에 아직 프로세스가 실행되지 않습니다. 사실 우리는 동일한 콘솔 창을 사용하여 새로운 프로세스를 시작합니다. – Epaga

3

프로그램을 처음 호출 할 때 적어도 하나의 들어오는 연결을 수락 했습니까? 그렇다면 당신이 가장 잘 볼 수있는 것은 소켓 링거가 효과가 있다는 것입니다. 가장 최선의 방법으로 설명하기 위해

나는 그것을 이해 응용 프로그램이 제대로 즉 (연결을 종료하지 않았기 때문에, 스티븐스

alt text http://www.kohala.com/start/gifs/tcpipiv1.gif

에 의해 TCP/IP 일러스트의 사본을 발굴 그러나 클라이언트와 서버가 FIN/ACK 시퀀스를 보냈습니다.) 수신 대기중인 소켓은 연결이 작동하지 않는 것으로 간주 될 때까지 재사용 할 수 없으며 소위 2MSL 시간 초과라고합니다. 1 MSL의 값은 운영 체제에 따라 다를 수 있지만 대개 최소 1 분이고 일반적으로 5와 비슷합니다.

이 조건을 피하기 위해 들었던 최고의 충고 (종료시 항상 모든 소켓을 올바르게 닫지 않아야 함) listen() 단계 동안 서버 소켓에서 SO_LINGER tcp 옵션을 0으로 설정하는 것입니다. freespace가 지적했듯이, java에서는 setReuseAddress (true) 메소드입니다.

+0

아니요 연결을 허용하지 않았습니다. 시작, 당장 꺼라. – Epaga

+0

그러나 이상한 점은 언급하는 시간 프레임 (일반적으로 적어도 1 분, 보통 5 이상)이 문제에 부합한다는 것입니다. - / – Epaga

0

나는 그것이 setReuseAddress (true)로 해결되는 일반적인 문제라고 생각해야한다고 말해야한다. 그러나이 경우 오류 메시지는 일반적으로 JVM이 포트에 바인드 할 수없는 행을 따라 표시됩니다. 전에 게시 된 오류 메시지를 본 적이 없어요. 인터넷을 통해 다른 프로세스가 하나 이상의 네트워크 인터페이스에서 수신 대기 중이며 모든 인터페이스에 바인드하도록 프로세스를 요청하는 반면, 일부 프로세스는 다른 프로세스가 수신하지 않는 프로세스를 바인딩 할 수 있음을 제안하는 것 같습니다. ~)하지만 전부는 아닙니다. 그냥 여기에 추측 ...

관련 문제