Java: очистить работающий объект с помощью сокета - PullRequest
2 голосов
/ 12 февраля 2012

Я пишу многопоточное серверное приложение на Java. Все отлично работает, но есть одна маленькая проблема. Когда я останавливаю исполняемый файл, который прослушивает входящий запрос соединения, сокет продолжает существовать. Итак, мой вопрос: как мне остановить работающий объект и очистить все объекты, сделанные в этом работающем?

Код для остановки потока:

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") ; 

Код запуска:

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() ; 
    } 
    }

Спасибо, Том

Ответы [ 2 ]

2 голосов
/ 12 февраля 2012

Вы можете закрыть сокет от основного потока. Это прервет вызов на accept и вызовет IOException. Затем вы можете выйти из метода run принимающего потока из перехвата IOException.

1 голос
/ 12 февраля 2012

Вам необходимо явно закрыть ServerSocket, вызвав close -метод сокета.Лучшее место для этого - метод run класса Worldwide, в блоке finally (поэтому сокет закрывается даже в случае возникновения исключения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...