Приложение J2ME закрывает сокет: сервер не получает все данные - PullRequest
0 голосов
/ 02 июля 2010

У меня проблема с клиентским приложением J2ME, которое отправляет данные на сервер J2SE и немедленно закрывает сокет отправки.На стороне J2ME я использую обычный OutputStream на SocketConnection и многократно вызываю write с небольшими пакетами данных (~ 30 байтов).После этого я flush и наконец close поток и соединение.

При запуске клиента в эмуляторе все работает нормально.Но с реальным устройством у меня возникают некоторые проблемы ...

Что я заметил, так это то, что соединение неправильно закрыто, независимо от того, что я делаю на клиенте.Я всегда получаю исключение Connection reset на сервере, которое в соответствии с TCP указывает на ошибку в соединении или отправителе, что означает, что все последующие данные должны быть отброшены и соединение больше не будет использоваться.(С эмулятором read на сервере в конечном итоге возвращает -1, указывая на то, что соединение было правильно закрыто, никаких исключений вообще ...)

Я пытался играть с общим размером пакета (1024, 2048, ...) и с опциями сокетов на стороне клиента (Задержка, Задержка, Поддержание активности).Я также пробовал Thread.sleep между flush и close ... На стороне сервера происходят разные вещи:

  • Получен только первый пакет размером около 30 байт, затем исключение (без задержки)
  • Часть данных получена (~ 1500 байт), затем данные больше не читаются и исключение не выдается, блокировка в методе read навсегда (с задержкой и общим размером около2048)
  • Все данные получены правильно, затем исключение (с задержкой и общим размером около 1024)

Во всех случаях клиент успешно отправил все данные.

Каков наилучший способ гарантировать, что все данные будут получены другой стороной?Как я уже сказал, клиент J2ME утверждает, что все данные были успешно записаны!(Общий размер не может быть привязан к конкретному значению)

Заранее спасибо!

1 Ответ

0 голосов
/ 02 июля 2010

Это похоже на ошибку в вашем устройстве, вы можете отправить сообщение со стороны J2SE, чтобы подтвердить прием, и ждать на стороне J2ME, что вы получите это сообщение, чтобы закрыть сокет.

...