При создании сетевых приложений очень важно внедрить ведение журнала сетевого ввода-вывода на ранней стадии разработки. Это поможет вам устранить простые ошибки, такие как разрывы соединения и неверные данные, отправляемые или получаемые.
Я предполагаю, что у вас проблемы с подключением в вашей тестовой среде: то есть в локальной сети?
Можете ли вы описать своего клиента? Это мобильное устройство?
Если вашему приложению требуется постоянное соединение, я бы порекомендовал реализовать некоторую логику повторного подключения. То есть, если соединение разорвано (вы обнаруживаете это при выполнении операции ввода / вывода), вы пытаетесь восстановить его с помощью партнера.
UPDATE:
if (availableBytes >5) {
obj = in.readObject();
message = (ClientMessage) (obj);
processMessage();
}
Что произойдет, если в доступных байтах сериализовано несколько объектов?
Что означает in.readObject () ? Читает ли он необходимое количество байтов для сериализации объекта или все, что доступно?
IMO возможная причина поведения, которое вы видите, состоит в том, что код не ожидает, что несколько объектов могут быть получены одновременно и сохранены в приемном буфере. Также приемный буфер может содержать части объектов (например, object1 + два байта объекта2).
TCP является потоковым протоколом, и поэтому вы не можете легко определить конец сообщения. Вы должны реализовать протокол, который будет определять начало и конец передаваемого сообщения.
В коде от вас