2012-02-12 2 views
2

Java로 다중 스레드 서버 응용 프로그램을 작성하고 있습니다. 모든 것이 잘 작동하지만 약간의 문제가 있습니다. 들어오는 연결 요청을 수신하는 runnable을 중지 할 때 소켓은 계속 존재합니다. 그래서 내 질문은 : 실행 개체를 중지하고이 실행 개체에서 만든 모든 개체를 정리하려면 어떻게해야합니까?Java : 소켓으로 실행 가능한 개체 정리

스레드 정지 코드 : 당신은 명시 적으로의 close -method를 호출하여 ServerSocket의를 닫아야합니다

public class Worldwide implements Runnable { 

Core core = Core.getInstance() ; 

public Worldwide() { 

} 
@Override 
public void run() { 

    try { 
    ServerSocket server = new ServerSocket(port) ; 

    core.printToConsole("Server is online") ; 
    core.printToConsole ("listening on port :" + server.getLocalPort()) ; 
    while (core.getServerSate() == true) { 

     Socket client = server.accept() ; 
     Runnable tr = new ClientCommunication(client) ; 
     new Thread (tr).start() ; 

    } 

    } 
    catch(Exception e) { 
     core.printToConsole ("An error occured while going online") ; 
     e.printStackTrace() ; 
    } 
    } 

감사합니다, 톰

+0

'Thread.stop'을 사용하지 마십시오. 이 메소드는 더 이상 사용되지 않습니다. 대신에,'Thread.interrupt'를 사용하고 스레드의 인터럽트 된 상태에 대한 당신의 루프 로직을 기반으로하는 것이 가장 좋습니다. 인터럽트를 잡았을 때 인터럽트를 전파해야합니다. – mre

+0

루프가 소켓 클라이언트 = server.accept();에서 멈추기 때문에 나는 저를 위해 작동하지 않는다는 것을 짐작한다; – tb96

답변

2

주 스레드에서 소켓을 닫을 수 있습니다. 이 경우 전화가 accept으로 중단되고 IOException이 전송됩니다. 그런 다음 수락 스레드의 run 메서드를 IOException의 catch에서 끝낼 수 있습니다.

+0

답변 주셔서 감사합니다.하지만 어떻게 주 스레드에서 소켓을 닫을 수 있습니까? – tb96

+0

@ tb96. 메인 쓰레드에 소켓을 생성하고 그것을 worker 쓰레드에 넘겨 줘야한다. 그렇게하면 두 스레드 모두에 소켓 객체가 있고 작업자 스레드에서'accept'를 호출하고 주 스레드에서'close'를 호출 할 수 있습니다. – Tudor

+0

감사합니다, 이것은 내가 필요한 대답이었다 : – tb96

1

:

Runnable tr = new Worldwide() ; 
     Thread thread = new Thread(tr) ; 
     thread.start() ; 
     online = true ; 

     while (core.getServerSate()) { 
      try{ 
      Thread.sleep(200); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } ; 
     thread.stop() ; 
     thread. 
     core.printToConsole("Server is offline now") ; 

Runnable 오브젝트 코드를 소켓. 가장 좋은 곳은 Worldwide -class의 run-method에서 finally -block입니다 (따라서 예외가 발생해도 소켓이 닫힙니다).

+0

답변 주셔서 감사합니다. – tb96

관련 문제