Как правильно остановить поток ServerSocket?Не удалось закрыть сокет - PullRequest
1 голос
/ 06 апреля 2011

Я знаю, что это уже обсуждалось несколько раз, но я не могу найти подходящее решение для моей проблемы.Я хочу запустить поток ServerSocket в фоновом режиме, прослушивая указанный порт.Это работает на самом деле, но только один раз.Кажется, что порт, который слушает сервер, никогда не закрывается правильно и все еще активен, когда я пытаюсь перезапустить (O не перезапускайте сам поток).Кто-нибудь может сказать, почему он не работает правильно?Заранее спасибо за любую помощь ...!

edit:

У меня та же проблема на стороне клиента.У меня есть ветка отправителя, а также, что никто не может быть остановлен.Каков наилучший способ сделать это?

ClientConnector - это просто класс, который подключается к порту сервера и отправляет данные.Это не нить или что-то в этом роде.

Это мой класс отправителя:

private class InternalCamSender extends Thread {

    private int sendInterval = 500;             // default 500 ms
    private ClientConnector clientConn = null;

    public InternalCamSender() {
        this.sendInterval = getSendingInterval();
        this.clientConn = new ClientConnector();
    }

    @Override
    public void run() {
        while(!Thread.currentThread().isInterrupted()) {
            clientConn.sendCamPdu(CodingScheme.BER, createNewPDU());
            try {
                Thread.sleep(sendInterval);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

И я пытаюсь справиться с таким поведением:

    if(jButton_startSending.getText().equals(STARTSENDING)) {
        new Thread() {
            public void run() {
                iSender = new InternalCamSender();
                iSender.start();
                jButton_startSending.setText(STOPSENDING);
            }
        }.start();
    } else {
        new Thread() {
            public void run() {
                if(iSender.isAlive()) {
                    iSender.interrupt();
                    try {
                        iSender.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                iSender = null;
                jButton_startSending.setText(STARTSENDING);
            }
        }.start();
    }

Каким-то образом яне может остановить InternalCamSender, как это.Я пробовал с volatile boolean раньше, было то же самое.Я прочитал страницу http://download.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html и попробовал также пример Что я должен использовать вместо Thread.stop? , но даже это не остановило поток?Я заблудился.

Есть идеи?

edit: нашел ответ на мою проблему с отправкой в ​​клинику здесь http://www.petanews.de/code-snippets/java/java-threads-sauber-beenden-ohne-stop/ даже я не знаю почему этоработает.Я уверен, что пытался сделать это раньше.

Проблема решена!

1 Ответ

5 голосов
/ 06 апреля 2011

Вы должны закрыть свои ресурсы (потоки и сокеты) в блоке finally, а не в блоке catch - таким образом, ресурсы всегда закрыты, независимо от того, перехвачено ли исключение.

Это также плохая практика - вызывать System.exit() из блока перехвата или из потока - вы принудительно завершаете работу всей JVM в случае возникновения ошибки. Вероятно, это также является причиной вашей проблемы с сокетом сервера - всякий раз, когда возникает какое-либо исключение при чтении / закрытии потоков, вы выходите из JVM, прежде чем у вас есть возможность закрыть сокет сервера.

...