无法与网络套接字通信.高速公路:收到 HELLO 消息,会话尚未建立



我正在尝试使用Python 3.4,Django,Autobahn和JS构建WebSocket会话。我已经在python端成功运行了websocket服务器,但我无法订阅或接收服务器发布的任何数据

我的代码相当简单:

class TestAppWS(ApplicationSession):
    """
    An application component that publishes an event every second.
    """
    def onConnect(self):
        self.join(u"realm1")
    @asyncio.coroutine
    def onJoin(self, details):
        counter = 0
        while True:
            self.publish('com.myapp.topic1', counter)
            counter += 1
            yield from asyncio.sleep(1)

def start_ws():
    print("Running")
    session_factory = ApplicationSessionFactory()
    session_factory.session = TestAppWS
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    # factory = WebSocketServerFactory("ws://localhost:8090", debug=False)
    # factory.protocol = MyServerProtocol
    server = None
    try:
        transport_factory = WampWebSocketServerFactory(session_factory, debug_wamp=True)
        loop = asyncio.get_event_loop()
        coro = loop.create_server(transport_factory, 'localhost', 8090)
        server = loop.run_until_complete(coro)
        loop.run_forever()
    except OSError:
        print("WS server already running")
    except KeyboardInterrupt:
        pass
    finally:
        if server:
            server.close()
        loop.close()

start_ws() 在单独的 Thread 对象中运行。如果我在浏览器上访问localhost:8090,我可以看到高速公路欢迎消息。

在前端我有

var connection = new autobahn.Connection({
   url: 'ws://localhost:8090/',
   realm: 'realm1'}
);
connection.onopen = function (session) {    
   var received = 0;
   function onevent1(args) {
      console.log("Got event:", args[0]);
      received += 1;
      if (received > 5) {
         console.log("Closing ..");
         connection.close();
      }
   }
   session.subscribe('com.myapp.topic1', onevent1);
};
connection.open();

它似乎不起作用,当我尝试连接前端时,我在后端收到以下错误:

Failing WAMP-over-WebSocket transport: code = 1002, reason = 'WAMP Protocol Error (Received <class 'autobahn.wamp.message.Hello'> message, and session is not yet established)'
WAMP-over-WebSocket transport lost: wasClean = False, code = 1006, reason = 'connection was closed uncleanly (I failed the WebSocket connection by dropping the TCP connection)'
TX WAMP HELLO Message (realm = realm1, roles = [<autobahn.wamp.role.RolePublisherFeatures object at 0x04710270>, <autobahn.wamp.role.RoleSubscriberFeatures object at 0x047102B0>, <autobahn.wamp.role.RoleCallerFeatures object at 0x047102D0>, <autobahn.wamp.role.RoleCalleeFeatures object at 0x047102F0>], authmethods = None, authid = None)
RX WAMP HELLO Message (realm = realm1, roles = [<autobahn.wamp.role.RoleSubscriberFeatures object at 0x04710350>, <autobahn.wamp.role.RoleCallerFeatures object at 0x04710330>, <autobahn.wamp.role.RoleCalleeFeatures object at 0x04710390>, <autobahn.wamp.role.RolePublisherFeatures object at 0x04710370>], authmethods = None, authid = None)
Traceback (most recent call last):
  File "C:Python34libsite-packagesautobahnwampwebsocket.py", line 91, in onMessage
    self._session.onMessage(msg)
  File "C:Python34libsite-packagesautobahnwampprotocol.py", line 429, in onMessage
    raise ProtocolError("Received {0} message, and session is not yet established".format(msg.__class__))
autobahn.wamp.exception.ProtocolError: Received <class 'autobahn.wamp.message.Hello'> message, and session is not yet established

在javascript控制台上,我看到:

Uncaught InvalidAccessError: Failed to execute 'close' on 'WebSocket': The code must be either 1000, or between 3000 and 4999. 1002 is neither.

知道吗?看起来会话没有开始,老实说,不清楚这个会话是如何工作的。一旦从客户端建立连接,就不应该初始化会话吗?

您的TestAppWs和浏览器代码都是 WAMP 应用程序组件。这两者都需要连接到 WAMP 路由器。然后他们可以自由地相互交谈(好像中间没有路由器一样透明)。

这是运行方法。

运行 WAMP 路由器。

使用 Crossbar.io(但您也可以使用其他WAMP路由器),这是微不足道的。首次安装 Crossbar.io:

pip install crossbar

Crossbar.io(目前)在Python 2上运行,但这无关紧要,因为您的应用程序组件可以在Python 3或任何其他WAMP支持的语言/运行时上运行。把 Crossbar.io 想象成一个黑匣子,一个外部基础设施,比如一个数据库系统。

然后创建并启动 Crossbar.io 默认路由器:

cd $HOME
mkdir mynode
cd mynode
crossbar init
crossbar start

运行你的 Python 3/asyncio 组件

import asyncio
from autobahn.asyncio.wamp import ApplicationSession

class MyComponent(ApplicationSession):
   @asyncio.coroutine
   def onJoin(self, details):
      print("session ready")
      counter = 0
      while True:
         self.publish('com.myapp.topic1', counter)
         counter += 1
         yield from asyncio.sleep(1)

if __name__ == '__main__':
   from autobahn.asyncio.wamp import ApplicationRunner
   runner = ApplicationRunner(url = "ws://localhost:8080/ws", realm = "realm1")
   runner.run(MyComponent)

运行浏览器组件

var connection = new autobahn.Connection({
   url: 'ws://localhost:8080/ws',
   realm: 'realm1'}
);
connection.onopen = function (session) {    
   var received = 0;
   function onevent1(args) {
      console.log("Got event:", args[0]);
      received += 1;
      if (received > 5) {
         console.log("Closing ..");
         connection.close();
      }
   }
   session.subscribe('com.myapp.topic1', onevent1);
};
connection.open();

相关内容

最新更新