| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java ME (J2ME) > периодически отваливаются j2me-клиенты |
| Автор: andrewjr20 10.7.2012, 17:46 |
| Добрый день Имеется сервер (асинхронные сокеты, C#, создан на основе http://www.codeguru.com/csharp/csharp/cs_network/sockets/article.php/c8781/Asynchronous-Socket-Programming-in-C-Part-II.htm), и клиенты на j2me (midp 2.0, cldc 1.0, на основе клиент-серверного примера NetworkingDemo). Чтобы отслеживать, живы ли клиенты, завёл список на сервере, и раз в 20 секунд заставил клиентов посылать некую строку, увеличивая время последней активности в списке, сам же сервер раз в 10 секунд проверяет список, не превысило ли время последней активности минуту - и если минуту клиент неактивен (батарея села, или ещё какая-проблема, при которой клиент отключен, но на сервере исключение не выскочило), клиент удаляется из списка и сокет принудительно закрывается. Но довольно часто бывает так, что клиент жив, сеть работает, но вышеозначенные пинги от него перестают идти - сервер его рубит, и на клиенте идёт обработка ошибки 10054 (что опять-таки подтверждает нормально функционирующую сеть). Перестают уходить пинги хоть сразу же после авторизации клиента, хоть через 5 минут, а могут только через полтора часа. До ввода этой системы пингов была немного другая система: сам сервер по своему списку сокетов просто отсылал некую строку, чтобы (в случае долгого периода неактивности на телефоне) поддерживать соединение и не быть отключенным оператором. Но даже тогда с той же непонятной периодичностью клиенты отваливались. Уже не знаю, что можно сделать, чтобы при наличии постоянного соединения с интернетом клиенты так же стабильно были подключены к серверу.. Заранее спасибо за помощь, если нужна какая-то дополнительная информация - обязательно напишу. |
| Автор: oxigen 11.7.2012, 12:13 |
| Не совсем понятен один момент. Но довольно часто бывает так, что клиент жив, сеть работает, но вышеозначенные пинги от него перестают идти А на клиенте что при этом происходит? Я так понял, что Вы по TCP общаетесь. Клиент отправил TCP пакет. Дальше он или получит ACK от сервера или выдаст IOException. Кстати что насчет wifi соединения или симулятора? То же самое происходит? |
| Автор: andrewjr20 13.7.2012, 20:14 |
| По тому непонятному моменту: на телефоне (по описаниям клиентов) в этот момент просто переставали обрабатываться объекты command, то есть пытается человек нажать кнопку и отправить данные, а телефон не реагирует в течение нескольких секунд, а потом ошибка 10054 и выключение. Но на деле - вина оператора (beeline), который ровно через полтора часа активного подключения при небольшом трафике, меньшем 1-1,5 МБ (сам не замерял, прочёл в интернете) отключает соединение - на телефоне на пару секунд выскакивает сообщение "пакетное подключение закрыто сетью", и связь обрубается. Проверял подобный момент на агенте mail.ru - ситуация аналогичная, но агент после такого дисконнекта предлагает переподключиться, что я и добавил в свой мидлет, так что вопрос можно считать закрытым |