В наличии имеется собственными руками написанные серверная и клиентская программы.
Серверная часть представляет собой работу с соккетами.
Клиентская часть подключается к этому серверу.
В клиентской части код, который отвечает за работу с соккетами, вынесен в сервис.
Сервис стартует при запуске приложения.
Дуплексное общение работает отлично. Всё идеально подключается и общается.
НО.
В клиентской программе есть кнопочка "Закрыть соединение"
Которая вызывает метод 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();
}
На скрине логи сервера.
Сначала я подключаюсь к серверу
Потом нажимаю на телефоне кнопку закрытия