неожиданный сокет иногда закрывается (или не открывается) - PullRequest
1 голос
/ 14 сентября 2011

Я создаю класс, который позволяет мне открывать один экземпляр моей Java-программы.Он использует поток демона, который открывает ServerSocket.если порт TCP уже был занят, выдается исключение во время создания экземпляра.

Код работает нормально в Linux и Windows.

Вот код, который я использую:

public class SingleInstaceHandler extends Thread {

    private static final Logger log = Logger.getLogger(IEPLC_Tool.class);
    private boolean finished = false;

    @SuppressWarnings("unused")
    private ServerSocket serverSocket;

    /*
     * Constructor
     * Generate the server socket.
     * If the TCP door was busy throws IOException.
     */
    public SingleInstaceHandler() throws IOException {
        @SuppressWarnings("unused")
        ServerSocket serverSocket = new ServerSocket(44331);
        this.setDaemon(true);
        this.start();
        log.info("Server socket initialized"); //if commented out it works
    }

    public void run() {
        synchronized (this) {
            while (!finished) {
                try {
                    log.debug("Server socket goes to sleep");
                    this.wait();
                    log.debug("Server socket waken up");
                } catch (InterruptedException e) {
                    log.debug("ERROR while sending SocketThread2 in wait status");
                    e.printStackTrace();
                    System.exit(-1);
                }
                log.info("Server socket end");
            }
        }
    }

    public synchronized void shutdown() {
        log.debug("SingleInstaceHandler shutdown() caled");
        finished = true;
        notifyAll();
    }
}

Иногда вместо этого порт не занят ... любая идея?


ОБНОВЛЕНО ПОСЛЕ ДАЛЬНЕЙШИХ ИСПЫТАНИЙ:

при выполнении многих других тестов.он показывает, что если порт занят чем-то вроде другого экземпляра SW, new ServerSocket(44331); выдает исключение, но иногда, даже если порт по какой-то причине не занят, он не может получить этот ресурс.в этом случае исключение не запускается, и я могу открыть столько экземпляров, сколько захочу для моего приложения.может быть, я должен сделать какую-то другую операцию, чтобы заставить поток заблокировать порт ...

любая идея?

Спасибо,

Ste

Ответы [ 2 ]

0 голосов
/ 15 сентября 2011

Я чувствую себя немного глупо, отправляя ответ на мой вопрос ... ну ... в моем коде есть ошибка, из-за которой я долго не мог понять:

проблема в том, что в конструкторе я делаю:

ServerSocket serverSocket = new ServerSocket(44331);

вместо:

this.serverSocket = new ServerSocket(44331);

Я не замечал этого раньше ... по сути, ошибка заключалась в том, что я объявлял локальный сокет внутри конструктора. Когда процедура constructur была завершена, сокет был освобожден или нет в зависимости от сборщика Garbadge. Поведение было довольно случайным. Забавно было то, что достаточно много времени, чтобы звонить / не звонить регистратору, было достаточно, чтобы запустить сборщик Garbadge или нет. Мне потребовалось много времени, чтобы заметить ошибку.

Более того, лучше поставить:

this.serverSocket.close() после ожидания.

Спасибо за помощь в любом случае!

Приветствия

Ste

0 голосов
/ 14 сентября 2011

Поскольку вы не сохраняете ссылку на ServerSocket, он будет иметь право на GC.Если вы используете Oracle JDK, сокет будет закрыт, когда он GCed (java.net.PlainSocketImpl).

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