У меня проблема с клиентским приложением 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 утверждает, что все данные были успешно записаны!(Общий размер не может быть привязан к конкретному значению)
Заранее спасибо!