Я использую GraniteDS Gravity для службы обмена сообщениями. Мое приложение отлично работает при использовании опроса данных, однако, когда я пытаюсь использовать канал веб-сокета вместо опроса данных, сообщения не могли доходить до клиентов. Я также попытался изменить пример приложения Gravity chat, созданного плагином Eclipse GraniteDS, для работы с каналами websocket, но это тоже не сработало.
Я использую Tomcat 7.0.39
Чтобы упростить воспроизведение этого случая, я перечислил изменения, которые я внес в приложение чата, созданное плагином GraniteDS для Eclipse.
В web.xml
1) Модифицированный класс сервлета:
Старый: org.granite.gravity.servlet3.GravityAsyncServlet
Новое: org.granite.gravity.tomcat.TomcatWebSocketServlet
2) Модифицированный шаблон URL-адреса отображения сервлета
Старый: /gravityamf/*
Новое: /websocketamf/*
3) Добавлен прослушиватель политики flash:
<listener>
<listener-class>org.granite.gravity.websocket.PolicyFileServerListener</listener-class>
</listener>
<context-param>
<param-name>flashPolicyFileServer-allowDomains</param-name>
<param-value>*:*</param-value>
</context-param>
В services-config.xml
1) Обновлено определение канала
Старый :
<channel-definition
id="gravityamf"
class="org.granite.gravity.channels.GravityChannel">
<endpoint
uri="http://{server.name}:{server.port}/{context.root}/gravityamf/amf"
class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
Новые:
<channel-definition
id="gravityamf"
class="org.granite.gravity.channels.WebSocketChannel">
<endpoint
uri="http://{server.name}:{server.port}/{context.root}/websocketamf/amf"
class="flex.messaging.endpoints.AMFEndpoint" />
</channel-definition>
Я не менял флекс-клиент. Когда я запустил приложение, Tomcat печатает журнал «Gravity успешно запущен». Но сообщения, отправленные производителем, не доходят до потребителя.
В чем может быть проблема? Мне что-то не хватает в конфигурации?
Спасибо.
1 ответ
После 4 дней борьбы с кодом я нашел причину проблемы. Сначала я обнаружил сообщение об ошибке при отладке сообщения Producer.send () на стороне клиента. При попытке подключения сокета возникает следующее исключение
"cannot connect to Web Socket server at
http://localhost:8080/gravityTest/websocketamf/amf
(IoError: Error #2031: Socket Error. URL: localhost)"
Но выброшенное исключение не достигает верхнего уровня, поэтому я долгое время не мог получить представление об исключении.
После поиска исключения я обнаружил, что оно вызвано политикой безопасности флеш-памяти. Затем я отладил PolicyFileServerListener и обнаружил, что localAddress сервера политики после привязки равен [/0:0:0:0:0:0:0:0:843]
, потому что он использует InetSocketAddressIPv6. Я предполагаю, что это поведение JDK 1.7 по умолчанию. Когда я меняю версию JDK на 1.6, localAddress становится [/0.0.0.0:843]
. После этого изменения мое приложение успешно обратилось к серверу политик, и обмен сообщениями через веб-сокет работал нормально.
Похожие вопросы
Новые вопросы
apache-flex
Apache Flex [НЕ CSS FLEXBOX] - это среда для разработки многофункциональных интернет-приложений, работающих в Flash Player или Adobe Air. Изначально разработанный компанией Adobe, Flex был подарен Apache Software Foundation в 2011 году и стал проектом Apache высшего уровня в декабре 2012 года.