- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Python 3.4、Django、Autobahn 和 JS 构建 WebSocket session 。我已经在 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,我可以看到 Autobahn 欢迎消息。
在前端我有
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:\Python34\lib\site-packages\autobahn\wamp\websocket.py", line 91, in onMessage
self._session.onMessage(msg)
File "C:\Python34\lib\site-packages\autobahn\wamp\protocol.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.
有什么想法吗?看起来 session 没有开始,老实说,不清楚这个 session 是如何工作的。一旦建立了来自客户端的连接,是否应该初始化 session ?
最佳答案
您的TestAppWs
和您的浏览器代码都是WAMP 应用程序组件。这两个都需要连接到 WAMP 路由器。然后他们可以自由地相互交谈(就好像中间没有路由器一样……透明地)。
运行方法如下。
运行 WAMP 路由器。
使用 Crossbar.io (但您也可以使用 other WAMP routers),这很简单。首先安装 Crossbar.io:
pip install crossbar
Crossbar.io (currently) runs on Python 2, but that's irrelevant as your app components can run on Python 3 or any other WAMP supported language/run-time. Think of Crossbar.io like a black-box, an external infrastructure, like a database system.
然后创建并启动一个 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();
关于javascript - 无法与 websocket 通信。高速公路 : received HELLO message, 且 session 尚未建立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27720020/
在 OSX 上使用 Chrome 连接到 websocket 服务器时出现问题。 我们使用这个包:https://github.com/voryx/Thruway 我在这里测试:http://webs
Autobahn 文档对于消息发布后哪些客户端/如何接收消息有点不清楚。开箱即用的消息似乎会广播给某个主题的所有订阅者 - 他们都收到了。但是有没有办法将消息分发给单个客户端呢?在队列中,多个发布者将
我想用 asyncio 创建一个 ReconnectingClientFactory。特别是处理客户端启动时服务器不可用的情况,在这种情况下 ReconnectingClientFactory 将继续
我正在使用 autobahn运行 websocket 服务器来补充我的 Django 应用程序。有时,我需要将消息从 Django 发送到 websocket 服务器,使用 websocket-cli
我正在通过 Python 的 multiprocessing.pipe 传输 WAMP 协议(protocol),我需要重新实现 WampCraClientProtocol。 问题 A:在不明确的情况
我是 websockets 的新手,我一直在使用 Autobahn websocket 来做一个更大的项目。它在 python 和 js 版本中运行良好,但我在使用 Android API 时遇到了问
是否可以使用默认的 Apple API?我知道它与谷歌有关,但我想尝试坚持使用苹果的一切。 最佳答案 根据documentation , 看起来 MKRoute 和 MKDirectionsReque
我有一个带有典型 onX 的高速公路 Websocket 服务器在它的协议(protocol)中起作用。我的问题是我找不到退出的方法 onX ,同时在特定消息到达时继续做我想做的各种事情。更具体地说在
语境 :我正在查询 OSRM 以返回两个坐标之间的路线。它返回我请求的路线以及部分(步骤)以及路线说明(v5 中的 RouteStep 对象数组)。 http://project-osrm.org/d
我在 Node 中使用此 AutobahnJS 代码从服务接收数据。它工作得很好,每秒获取多个事件。当我的互联网暂时断开连接时,Autobahn 没有检测到丢失的连接并且没有将“Websocket 连
如果由于某种原因连接“断开”,我正在尝试使用 Python 和 Autobahn 与 Twisted 重新连接客户端。 有一个很好的例子 here使用 ReconnectingClientFactor
我在 Payara 服务器上设置了一个 Java EE 端点,我尝试使用 Autobahn WebSockets 连接到一个 Android 客户端。我有以下设置: 我在服务器上的 WebSocket
我正在尝试使用 Python 3.4、Django、Autobahn 和 JS 构建 WebSocket session 。我已经在 python 端成功运行了 websocket 服务器,但是我无法
我是 Autobahn 和 Websockets 的新手。我正在尝试构建以下设置: 处理服务(基于 Java 的黑盒): 等待来自 Twitter 的流媒体 API 的数据 如果收到新消息,则会将消息
websocket 客户端(使用 Autobahn/Python 和 Twisted)需要连接到 websocket 服务器:客户端需要向服务器出示其客户端证书,客户端需要检查服务器的证书。例如,这些
我是一名优秀的程序员,十分优秀!