Как создать SocketClosedHandler в Java? - PullRequest
1 голос
/ 24 декабря 2011

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

Socket s = new Socket(ip, port);
s.addSocketClosedHandler(new SocketClosedHandler(){

    @Override
    public void onSocketClosed(SocketClosedEvent e){
        ...
    }

});

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

Вы хотите обработать событие, которое you закрывает сокет, или событие, когда «другая сторона» закрывает сокет? В первом случае вы можете создать подкласс Socket и добавить обработчики, вызываемые при вызове close.

В последнем случае проблема заключается в том, что это не определяется автоматически, и что надежное обнаружение может быть затруднено и зависит от протокола, используемого для связи через сокет. Смотрите, например это ТАК вопрос. В общем случае вам придется принять меры, чтобы определить, была ли розетка на самом деле закрыта другой стороной. Если это так, вам нужно будет принять меры. Какое бы действие вы ни предприняли, вы можете убедиться, что оно также вызывает обработчики обратного вызова, которые вы зарегистрировали для этого действия.

0 голосов
/ 24 декабря 2011

Почему вы не можете использовать обработку исключений?Это способ разработки API.

Единственный другой способ сделать это - спроектировать протокол так, чтобы другая сторона отправляла что-то до того, как он собирается закрыться, чтобы локальный вызов close()сделать первым - но это не всегда будет работать, например, если соединение неожиданно закрыто.

...