Ошибка сети Java во время синхронизации файлов - PullRequest
3 голосов
/ 21 февраля 2012

В настоящее время я работаю над простой синхронизацией файлов между клиентом и сервером .Для этого клиент и сервер следуют простому протоколу , который определяет, в каком порядке отправляются сообщения.

сокращенный протокол (с использованием Object / ByteArrayStreams):

Цикл клиента:

  1. Отправить имя файла
  2. Отправить информацию о файле
  3. Отправить данные
  4. Ожидание подтверждения сервера

Цикл сервера:

  1. Считать имя файла
  2. Считать информацию о файле
  3. Получить данные
  4. Отправить подтверждение клиенту

Повторить.

Проблема в том, что протокол выходит из строя, когда во время передачи возникает ошибка , а я обычно получаю StreamCorruptedExceptions, так как по крайней мере одна сторона ожидает чего-то другого.

Вот пример ситуации, в которой возникла проблема: сбой сервера во время приема файла (3) по любой причине.Теперь сервер ждет имя файла.Из-за ошибки клиент прибывает в часть 3, отправляя данные.Затем создается исключение, поскольку сервер ожидает объект сообщения, а клиент отправляет байтовые данные.

Как лучше всего решить эту проблему?

1 Ответ

2 голосов
/ 22 февраля 2012

некоторые мысли

  • возможно, отправлять подтверждение после каждого этапа - это будет намного проще контролировать
  • Подтверждение от сервера может отправить контрольную сумму, что клиент может проверить целостность транзакции и двигаться дальше. (например, md5).
  • реализовать сервер без сохранения состояния, то есть сервер, который может самостоятельно решать, какой этап обслуживать, основываясь на каком-то «магическом числе», которое вы можете установить в начале каждой транзакции (заголовок). Таким образом, клиент может повторить попытку на любом этапе, и сервер сможет ответить соответствующим образом.
  • Вы можете расширить заголовок, чтобы он содержал уникальный идентификатор для уникальных файлов, чтобы вы могли распараллеливать всю связь и загружать несколько файлов в несколько этапов и с нескольких клиентов.

Другие мысли

  • Если вы хотите избежать проблемы, вместо ее решения вы можете использовать для этого очень эффективные библиотеки, вместо того, чтобы заново изобретать колесо. Проверьте protobuf - это сложно освоить, но чрезвычайно эффективно, gson , который очень прост в освоении, хотя и менее эффективен, или многие другие готовые протоколы.
...