我有一个使用Twisted的Autobahn Python客户端应用程序,它连接到Crossbar.io服务器.使用ReconnectingClientFactory丢失网络连接后,客户端应用程序可以成功重新连接.客户端在连接时注册被叫方名称,以便其他应用程序可以调用它.这始终适用于初始连接.
但是,从丢失的连接恢复时,无法重新注册被叫方名称,因为仍然从先前丢失的连接注册了被叫方名称.这会导致错误'wamp.error.procedure_already_exists'.由于被叫方名称注册仍与先前丢失的连接相关联,因此我将取消注册旧的被叫方名称.
我能看到的唯一解决方案是在每个连接上生成并注册唯一的新被叫方名称,以避免与先前注册的被叫方名称冲突.
有没有更好或更简单的方法来处理这个?似乎WAMP协议允许使用注册ID从另一个连接取消注册被调用者名称,但是高速公路Python客户端库似乎不允许这样做.
我喜欢crossbar.io以及它是如何工作的(个人).但我想知道如何使用Autobahn(Crossbar.io)为典型的动态聊天应用程序设置架构.
这里的动态聊天意味着为每个网址创建了单独的聊天室.
例如:http://www.myapplication.com/chat?roomId=123,创建一个订阅主题"com.myapp.chat123"的聊天室.
http://www.myapplication.com/chat?roomId=456,创建一个订阅主题"com.myapp.chat456"的聊天室.
我们需要将聊天消息存储在数据库中以供将来参考,因为高速公路没有消息持久性.
现在我的问题是:
如果每个聊天室使用单独的主题,那么我们如何订阅服务器中的消息(因为我们现在无法使用模式订阅)?
由于我们将为每个房间使用单独的主题,我们如何在Crossbar.io中进行身份验证和授权?
我无法找到用于设置此处提到的功能的Javascript文档.哪里可以找到它?
在这个SO答案中,有人提到crossbar.io为会话加入或离开路由器提供元事件.有没有办法知道用户何时订阅或取消订阅特定主题而不是路由器加入或离开?
您能解释一下如何使用当前版本的Crossbar.io(在Javascript,浏览器或Node.js中)配置可用的高级配置文件功能吗?
你能详细解释一下事件历史功能吗?以及如何配置它?
我有一个使用crossbar注册一些RPC的服务器,以及一个试图确保使用sinon调用RPC的测试.
server.js
"use strict";
const autobahn = require( "autobahn" );
const server = () => {
const open = () => console.log( "Hello world" );
const start = () => new Promise( fulfil => {
const connection = new autobahn.Connection( {
"url": "ws://localhost:8080/ws",
"realm": "realm1"
} );
connection.onopen = session => {
session.register( "server.open", open )
.then(() => fulfil())
.catch(console.log);
};
connection.open();
} );
//removing Object.freeze won't help =(
return Object.freeze({
start,
open
});
};
module.exports = server; …Run Code Online (Sandbox Code Playgroud) 我有一个 Crossbar.js 实现,其中数据通过 Crossbar websocket 服务器在客户端(网站)和服务器(Node.js)之间发送。双方使用 Autobahn.JS 连接到 Crossbar 服务器。
连接工作正常,但似乎客户端和服务器都在随机时刻断开并重新连接。这种情况大约每两分钟发生一次。我还看到双方的连接断开不是同时发生的。这让我认为问题出在我在双方使用的高速公路实现上(客户端和服务器大致相同)。
下面是我用来从 Node.js 连接到 Crossbar 服务器的方法。浏览器的版本几乎相同。我只更改了订阅并将const和let变量更改为var.
start(connectionConfig) {
const self = this;
self.host = connectionConfig.host;
self.realm = connectionConfig.realm;
self.channelPrefix = connectionConfig.channelPrefix;
try {
// Start an Autobahn websocket connection
self.connection = new autobahn.Connection({"url": self.host, "realm": self.realm});
self.connection.onopen = function(session) {
// Save session in class
self.session = session;
// Listen for incoming commands
session.subscribe(self.channelPrefix + 'smdc-server', self.onCommand.bind(self));
// Copy the class variable buffer to …Run Code Online (Sandbox Code Playgroud) 我刚开始使用Crossbar.io来实现实时统计页面.我看了很多代码示例,但我无法弄清楚如何执行此操作:
我有一个Django的服务(为避免混淆,你可以假设I'm谈论views.py功能),我想它在一个特定的主题发布消息,每当它被调用.我见过这些方法:(1)扩展ApplicationSession和(2)使用"runned"的Application实例.
它们都不适合我,因为Django服务不在一个类中,也不是作为一个独立的python文件执行,所以我找不到一种方法来调用"发布"方法(即我唯一想在服务器端做的事情).
我试图让"StatsBackend",延伸ApplicationSession的实例,并发布一些信息,但StatsBackend._instance是无总是(甚至当我执行"横梁开始"和StatsBackend.INIT()被调用).
StatsBackend.py:
from twisted.internet.defer import inlineCallbacks
from autobahn import wamp
from autobahn.twisted.wamp import ApplicationSession
class StatsBackend(ApplicationSession):
_instance = None
def __init__(self, config):
ApplicationSession.__init__(self, config)
StatsBackend._instance = self
@classmethod
def update_stats(cls, amount):
if cls._instance:
cls._instance.publish('com.xxx.statsupdate', {'amount': amount})
@inlineCallbacks
def onJoin(self, details):
res = yield self.register(self)
print("CampaignStatsBackend: {} procedures registered!".format(len(res)))
Run Code Online (Sandbox Code Playgroud)
test.py:
import StatsBackend
StatsBackend.update_stats(100) #Doesn't do anything, StatsBackend._instance is None
Run Code Online (Sandbox Code Playgroud) 据我了解,crossbar 提供客户端之间的透明连接。这样客户就可以相互沟通。WebRTC 几乎做同样的事情,没有中央服务器(除了信令服务器),延迟较低。
那么为什么我们首先需要横杆呢?
我错过了什么吗?
crossbar ×6
autobahn ×4
javascript ×3
python ×2
twisted ×2
autobahnjs ×1
autobahnws ×1
django ×1
mocha.js ×1
node.js ×1
sinon ×1
webrtc ×1