2009-03-19 4 views
2

Tomcat 앱을 쓰고 있습니다. 이 기능의 일부로 특정 이벤트가 발생할 때 UDP 멀티 캐스트를 전송해야합니다. 지금 내 코드는 다음과 같이 (호스트 그룹은 가짜, 예외 처리는 공간을 절약하기 위해 찢어된다) 이동 :Tomcat의 소켓에 바인딩

import java.net.*; 
/* ..... */ 
DatagramSocket socket = new DatagramSocket(12345); 
InetAddress group = InetAddress.getByName("111.222.333.444"); 
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 12346); 
socket.send(packet); 

내가 바람둥이에 설치 할 때 잘 작동; 그러나 "ant remove; ant install;"을 사용하여 새 버전의 응용 프로그램을 설치하려고하면 소켓에 바인딩하지 않고 java.net.BindException: Address already in use을 얻지 못합니다. 유일한 방법은 매번 Tomcat을 재시작하는 것이고, 이는 분명히 받아 들일 수없는 방법입니다. Tomcat 친화적 인 방법으로 소켓을 사용하려면 어떻게해야합니까?

피트의 대답은 당 해명의 몇 : 내가 소켓을 닫지 마십시오

; 그것은 싱글 톤 (Singleton)에 산다. 싱글 톤에 소켓을 닫고 서블릿의 파괴를 호출 할 수있는 메소드를 추가하면 감사합니다! 좀 해킹 된 것 같아요. (공개 메소드를 통해 그와 같은 메소드를 세상에 노출합니다.)하지만, 그 일은 끝납니다.

+0

방금 ​​destroy()에 추가 한 경우 해킹이되어서는 안됩니다. 서블릿 컨테이너 만이 그 내용을 알 수 있다면 (webapp 사용자와 같이 public이 아닌)이를 호출 할 수 있습니다. – Peter

답변

1

disconnect()/close()를 통해 사용한 후에 소켓을 닫으시겠습니까? 소켓의 라이프 사이클은 무엇입니까? 요청 또는 싱글 톤입니까? 요청 당 경우 소켓을 닫으면 해제해야합니다. 만약 싱글 톤이라면 어떻게 든 앤트 삭제 (ant remove)에서 닫아야한다. 톰캣을 종료/재시작하는 것이 허용되지 않는다면, 앤트 스크립트는 소켓을 닫는 보안 페이지 등을 호출 할 수있다. 종료 재시작이 발생할 수 있으면 서블릿의 destroy() 메소드에서 소켓을 닫으십시오.