Autobahn.JS掉线

我有一个Crossbar.js实现,在客户端(网站)和服务器(Node.js)之间通过Crossbar websocket服务器发送数据。 双方都使用Autobahn.JS连接到Crossbar服务器。

连接工作正常,但似乎客户端和服务器断断续续,随机时刻重新连接。 这大约每两分钟发生一次。 我也看到,双方的连接并没有同时发生。 这让我觉得问题在于我在双方使用的Autobahn实现(对于客户端和服务器来说大致相同)。

下面是我用来从Node.js连接到Crossbar服务器的方法。 浏览器的版本几乎完全相同。 我只改变了订阅,并改变了constletvariablesvar

  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 a local variable and set the // class variable buffer to an empty array. let localBuffer = self.socketBuffer; self.socketBuffer = []; // Send all messages from the local buffer that were 'send' using the class method (not displayed here on StackOverflow) while the connection was not yet established. for (var i = 0; i < localBuffer.length; i++) { session.publish(localBuffer[i].channel, [localBuffer[i].data]); } } self.connection.onclose = function(reason, details) { console.log("Autobahn closed!"); console.log("Reason: "); console.log(reason); console.log("Details: "); console.log(details); self.session = null; } self.connection.open(); } catch (err) { console.log(err); } } 

我看不到在代码中的错误,导致连接下降的部分。

这是控制台输出的内容:

 Autobahn closed! Reason: lost Details: { reason: null, message: null, retry_delay: 1.4128745255660942, retry_count: 1, will_retry: true } Autobahn closed! Reason: lost Details: { reason: null, message: null, retry_delay: 1.2303848117273903, retry_count: 1, will_retry: true } 

由于retry_countvariables总是1 ,我认为连接在这些drop之间被恢复。

这是Crossbar服务器输出的内容:

 2017-08-23T10:46:34+0200 [Router 10622] session "1355162039012002" left realm "SMDC" 2017-08-23T10:46:35+0200 [Router 10622] session "2006451409833362" joined realm "SMDC" 2017-08-23T10:46:37+0200 [Router 10622] session "2006451409833362" left realm "SMDC" 2017-08-23T10:46:37+0200 [Router 10622] session "224071819838749" joined realm "SMDC" 

由于交叉开关服务器能够列出断开和连接,我不认为交叉开关是问题。

我希望有人有洞察力,帮助我:)

这听起来不像Autobahn.js(或Crossbar.js)的问题。 这似乎更像是一个与浏览器或TCP超时规格有关的问题。

空闲连接可能会在某个时候终止。 这个连接中涉及的一些软件或设备似乎已经确定它闲置太久,因此closures它。 通常这是一件好事, 你不希望死连接闲置几天,实际上TCP的devise。

现在,我们来谈谈解决scheme。 实际上这很简单。 您希望通过每隔X秒发送一些消息来保持连接的正常运行。 例如,通过每隔30秒发送一次心跳或ping命令,就可以消除浏览器,客户端或服务器操作系统以及中间的任何其他设备由于闲置太久而终止连接。

如果你想绝对确定连接被终止闲置太久,你可能想看看Wireshark。 通过查看实际上通过线路发送的原始数据包,您将很快find终止的确切原因。