当我将secure选项设置为true时,我遇到了订阅我的websocket服务器的问题。我运行了一个SSL验证器,以确保它已正确设置并且一切都通过了。同样为了安全起见,我还检查了我的托管服务提供商,所以我不相信这是问题所在。而且,当安全设置为false时,一切都会起作用。
WSS正在端口8676上运行,我确实确保端口已打开。
我正在使用Stomp Javascript库。我从他们的github主分支(https://github.com/projectodd/stilts/blob/master/stomp-client-js/src/main/javascript/stomp.js)下载了最新版本。
我一直在_transmit()
函数中发现此错误:can't call transmit on undefined
似乎没有在_transport
函数中设置_buildConnector()
属性。我添加了一些console.logs,它总是转到此函数中的else
语句。
关于修复的任何想法?或者我错过了什么?
这就是我初始化连接的方式:
client = new Stomp.Client('my.ip.address', 8676, true);
以下是我记录某些功能的地方:
Stomp.Client = function(host, port, secure) {
console.log('host param: ' + host);
console.log('port param: ' + port);
console.log('secure param: ' + secure);
this._host = host || Stomp.DEFAULT_HOST;
this._port = port || Stomp.DEFAULT_PORT || 8675;
this._secure = secure || Stomp.DEFAULT_SECURE_FLAG || false;
console.log('this._host: ' + this._host);
console.log('this._port: ' + this._port);
console.log('this._secure: ' + this._secure);
}
输出:
host param: my.ip.address
port param: 8676
secure param: true
this._host: my.ip.address
this._port: 8676
this._secure: true
_buildConnector: function(transports, i) {
console.log('INSIDE _buildConnector()');
var callback = this._connectCallback;
var client = this;
if ( i < transports.length ) {
console.log('IF!!!');
return function() {
var fallback = client._buildConnector( transports, i+1, callback );
try {
console.log('_buildConnector::IF::TRY');
transports[i].connect( function() {
client._transport = transports[i];
callback();
}, fallback );
} catch (err) {
console.log('_buildConnector::IF::CATCH');
fallback();
}
};
} else {
console.log('_buildConnector::ELSE');
return client.connectionFailed.bind(this);
}
}
输出:
INSIDE _buildConnector()
IF!!!
INSIDE _buildConnector()
IF!!!
_buildConnector::IF::TRY
INSIDE _buildConnector()
_buildConnector::ELSE
_buildConnector::IF::TRY
connectionFailed: function() {
console.log('INSIDE connectionFailed()');
if (this._errorCallback)
{
console.log('connectionFailed::IF');
console.log('this._errorCallback');
console.log(this._errorCallback);
console.log('arguments');
console.log(arguments);
this._errorCallback.apply(this._errorCallback, arguments);
}
else
{
console.log('connectionFailed::ELSE');
console.log('unable to connect :(');
Stomp.logger.log( "unable to connect" );
}
}
输出:
No output..
答案 0 :(得分:0)
我发现了这个名为wscat
的node.js工具,可用于将消息发送到websocket服务器(http://einaros.github.io/ws/)。
使用外部地址输入命令时:
wscat -c wss://my.ip.address:8676
我不断收到以下错误:error: Error: Hostname/IP doesn't match certificate's altnames
但是当我将其更改为我的域名时:
wscat -c wss://mydomain.com:8676
我收到了这条消息:connected (press CTRL+C to quit)
导致我:
我将Javascript中的主机值设置为STOMP所在服务器的外部IP地址。但是SSL证书是为域名配置的。这使我认为我应该使用mydomain.com
而不是my.ip.address
作为new Stomp.Client
中的主机参数。但这会导致Torquebox日志文件中出现以下错误:
NoSuchHostException: No such host: mydomain.com
然后在torquebox.yml
文件中,主机属性也需要配置为mydomain.com
。
所以结论是:在尝试连接到websocket服务器时,您需要使用已注册到SSL证书的域名,而不是外部IP地址。好哇!
感谢:@bobmcwhirter在这里帮助我找到了这个解决方案:https://github.com/projectodd/stilts/issues/20