Подключение к веб-сокету с помощью SocketChannel Android

Я написал приложение для Android, которое подключается к серверу веб-сокетов, серверному приложению и приложению для Android, реализованному с помощью библиотеки веб-сокетов Autobahn.

Я могу успешно подключиться и обменяться сообщениями с сервером. но через некоторое время (через 20-30 минут) приложение Android перестает общаться с сервером (оно не может отправлять сообщения на сервер). В logcat показано, что приложение все еще подключается к веб-сокету, даже если оно не может отправлять сообщения на сервер.

Я просмотрел исходный код библиотеки Autobahn и обнаружил, что она использует java.nio.channels.SocketChannel для подключения к веб-сокету. Есть ли проблемы с использованием SocketChannels? (Я обнаружил аналогичную проблему здесь Android - Как поддерживать связь с сервером долгое время)


person eranga    schedule 04.02.2014    source источник
comment
Как это не удается? Вы отправляете сообщение, а сообщение недоступно на другой стороне? Какой тип SocketChannel вы используете (блокирующий / неблокирующий)?   -  person webuster    schedule 04.02.2014
comment
Через некоторое время я не могу отправлять сообщения на сервер с мобильного телефона. да, сообщения недоступны на другой стороне. Библиотека автобанов с использованием режима блокировки. Это исходный код библиотеки автобана - (github.com/tavendo/AutobahnAndroid/blob/master/Autobahn/src/de/)   -  person eranga    schedule 04.02.2014
comment
Возможно, получатель недостаточно быстро обрабатывает данные. Взгляните сюда, это может помочь: jfarcand.wordpress.com/2006/05/30/   -  person webuster    schedule 04.02.2014
comment
Я решил проблему. Ниже мой ответ. Спасибо.   -  person eranga    schedule 14.02.2014


Ответы (1)


Наконец, я решил проблему, используя сообщение webcoket ping / pong.

На самом деле проблема не в SocketChannel, я пробовал использовать простой Socket вместо SocketChannel. Проблема не решена даже с Socket.

Это подход, который я использовал ...

Чтобы поддерживать соединение с веб-сокетом, нам необходимо использовать сообщения Ping / Pong, которые встроены в поддержку протокола websockt (дополнительная информация протокол веб-сокета). Серверу необходимо периодически отправлять клиентам сообщение ping. Когда ping получает от сервера, клиент отвечает на него сообщением pong. Используя этот способ, мы можем поддерживать соединение в течение длительного времени.

Библиотека Autobahn, которую я использовал для создания моей клиентской поддержки webscoket для этих сообщений ping / pong. Когда сообщение ping получено через веб-узел, библиотека автоматически отправляет сообщение pong на сервер. Так что нам не нужно беспокоиться об отправке сообщений pong вручную. Вы можете найти реализацию сообщения ping / pong на автобане здесь (в методе createHandler () - реализация автобана ping / pong)

Вы также можете получить более подробную информацию по этой теме в этой теме Веб-сокеты. Потеря интернета, сообщений keep-alive, архитектуры приложения и т. Д.

person eranga    schedule 14.02.2014