Autobahn.JS 断开连接
Autobahn.JS drops connection
我有一个 Crossbar.js 实现,其中数据通过 Crossbar websocket 服务器在客户端(网站)和服务器(Node.js)之间发送。双方都使用 Autobahn.JS 连接到 Crossbar 服务器。
连接工作正常,但客户端和服务器似乎都在随机时刻断开连接并重新连接。这种情况大约每两分钟发生一次。我还看到连接断开并没有在双方同时发生。这让我认为问题出在我在双方使用的 Autobahn 实现上(客户端和服务器大致相同)。
以下是我从 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 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 Whosebug) 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_count
变量始终是 1
,我认为这些滴之间的连接已恢复。
这是 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"
由于 Crossbar 服务器能够列出断开连接和连接,我认为 Crossbar 不是问题所在。
我希望有人对我有帮助:)
这听起来不像是与 Autobahn.js(或 Crossbar.js 相关)的问题。这似乎更像是与浏览器或 TCP 超时规范有关的问题。
空闲连接可能会在某个时候终止。似乎此连接中涉及的某些软件或设备已确定其空闲时间过长,因此将其关闭。通常这是一件好事;您不希望死连接连续几天处于空闲状态,这实际上是 TCP 的设计方式。
现在,让我们谈谈解决方案。其实很简单。您希望通过每 X 秒发送某种消息来保持连接。例如,通过每 30 秒发送一次心跳或 ping,您可以避免浏览器、客户端或服务器 OS 以及介于两者之间的任何其他设备因空闲时间过长而终止连接。
如果您想绝对确定连接因空闲时间过长而终止,您可能需要查看 Wireshark。通过查看实际通过线路发送的原始数据包,您将很快找到它被终止的确切原因。
我有一个 Crossbar.js 实现,其中数据通过 Crossbar websocket 服务器在客户端(网站)和服务器(Node.js)之间发送。双方都使用 Autobahn.JS 连接到 Crossbar 服务器。
连接工作正常,但客户端和服务器似乎都在随机时刻断开连接并重新连接。这种情况大约每两分钟发生一次。我还看到连接断开并没有在双方同时发生。这让我认为问题出在我在双方使用的 Autobahn 实现上(客户端和服务器大致相同)。
以下是我从 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 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 Whosebug) 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_count
变量始终是 1
,我认为这些滴之间的连接已恢复。
这是 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"
由于 Crossbar 服务器能够列出断开连接和连接,我认为 Crossbar 不是问题所在。
我希望有人对我有帮助:)
这听起来不像是与 Autobahn.js(或 Crossbar.js 相关)的问题。这似乎更像是与浏览器或 TCP 超时规范有关的问题。
空闲连接可能会在某个时候终止。似乎此连接中涉及的某些软件或设备已确定其空闲时间过长,因此将其关闭。通常这是一件好事;您不希望死连接连续几天处于空闲状态,这实际上是 TCP 的设计方式。
现在,让我们谈谈解决方案。其实很简单。您希望通过每 X 秒发送某种消息来保持连接。例如,通过每 30 秒发送一次心跳或 ping,您可以避免浏览器、客户端或服务器 OS 以及介于两者之间的任何其他设备因空闲时间过长而终止连接。
如果您想绝对确定连接因空闲时间过长而终止,您可能需要查看 Wireshark。通过查看实际通过线路发送的原始数据包,您将很快找到它被终止的确切原因。