OMGcoder
@OMGcoder
Начинающий java программист

Как правильно разрывать соединение с java WebSocket?

В наличии имеется собственными руками написанные серверная и клиентская программы.

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

Дуплексное общение работает отлично. Всё идеально подключается и общается.

НО.
В клиентской программе есть кнопочка "Закрыть соединение"
Которая вызывает метод closeConnection();

И вот когда я нажимаю кнопку то на сервере вылазит такой EOFException. Причины его возникновения мне не понятны.

Как решить данную проблему и в чём она кроется?
Весь код написан в целях дипломной работы.
Я не обладаю хорошими знаниями программирования
Делаю программу и в ходе работы обучаюсь.

Так что просьба не закидывать камнями :)

Код серверной части
@ServerEndpoint(value = "/server/{username}",
        encoders = MessageEncoder.class,
        decoders = MessageDecoder.class)
public class MessageServer {

    ChatRoom chatRoom = new ChatRoom();

    @OnOpen
    public void onOpen(Session session, @PathParam("username") String username) {
        chatRoom.getClients().put(username, session);
        chatRoom.sendBroadcast(new Message(username, "all", "Client" + username + " connected!"));

        System.out.println("OnOpen: Client: " + username + " connected! " + new Date());
    }

    @OnMessage
    public void onMessage(Session session, Message message) {
        chatRoom.sendBroadcast(message);
    }

    @OnClose
    public void onClose(Session session, @PathParam("username") String username){
        System.out.println("OnClose Client: " + username + " disconnected! " + new Date());
    }


    @OnError
    public void onError(Session session, Throwable throwable, @PathParam("username") String username) {
        System.out.println("OnError Client: " + username + " Exception: " + throwable + " " + new Date());
        throwable.printStackTrace();
    }

}


Часть кода сервиса клиентской части (Соединение и работа с соккетами)
webSocketClient = new WebSocketClient(uri) {
            @Override
            public void onOpen() {
                Log.d(DebugUtils.TAG, "onOpen: OnOpen successfully!");
            }

            @Override
            public void onTextReceived(String json) {

                try {
                    Message message = gson.fromJson(json, Message.class);
                    Log.d(DebugUtils.TAG, "onTextReceived: " + message.getContent());


                    if (isBound) {
                        Log.d(DebugUtils.TAG, "onTextReceived: activity alive! sending broadcast");
                        Intent intent = new Intent(App.ACTION_MESSAGE_RECEIVED);
                        intent.putExtra(App.MESSAGE_EXTRA, message);
                        sendBroadcast(intent);

                    } else {
                        Log.d(DebugUtils.TAG, "onTextReceived: activity dead! making notification");

                        makeMessageNotification(message.getSender(), message.getContent());
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.d(DebugUtils.TAG, "onTextReceived: Exception!!!");
                }


            }

            @Override
            public void onBinaryReceived(byte[] data) {
                Log.d(DebugUtils.TAG, "onBinaryReceived: ");
            }

            @Override
            public void onPingReceived(byte[] data) {
                Log.d(DebugUtils.TAG, "onPingReceived: ");
            }

            @Override
            public void onPongReceived(byte[] data) {
                Log.d(DebugUtils.TAG, "onPongReceived: ");
            }

            @Override
            public void onException(Exception e) {

                Log.d(DebugUtils.TAG, "onException: " + e);
            }

            @Override
            public void onCloseReceived() {
                Log.d(DebugUtils.TAG, "onCloseReceived: ");
            }
        };

        webSocketClient.setConnectTimeout(10000);
        webSocketClient.setReadTimeout(300000);
        webSocketClient.enableAutomaticReconnection(5000);
        webSocketClient.connect();


Часть кода сервиса клиентской части (Закрытие соединения)
public void closeConnection() {
        webSocketClient.close();
    }


На скрине логи сервера.

Сначала я подключаюсь к серверу
Потом нажимаю на телефоне кнопку закрытия

5e13031084630077587997.png
  • Вопрос задан
  • 271 просмотр
Решения вопроса 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
В никсах все есть файл. Закрывая соединение, вы закрываете файл, о чем вам честно и сообщают.

Заверните на сервере этот эксепшен в catch блок
Добавьте в свой лог сообщение

Пользователь такой то прервал соединение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы