我正在使用angular 4, Express 4.16.3 和 Socket.IO 2.1.1 为 Support Admin Panel 创建聊天引擎>使用管理面板的支持团队可以与我正在使用管理面板一侧的一台服务器的网站和 2个客户端上的客户聊天,其中一个客户端又在管理面板上支持团队,另一个在网站上为客户服务。
我有两个子域(一个用于面板,一个用于网站),并引用this answer,因为我需要在socket.io中进行跨域连接的解决方案
服务器位于adminpanel.azurewebsites.net
我的两个客户端都部署在两个子域上:
site.azurewebsites.net上的网站客户端和
adminpanel.azurewebsites.net上的面板(支持)客户端
我还启用了adminpanel.azurewebsites.net上的CORS(将Access-Control-Allow-Origin标头设置为*),并且还启用了Azure门户上的websocket。我的两个应用都是https。
服务器端(管理面板)如下:
port = process.env.PORT || 1337;
var server = require('http').Server(app);
var io = require('socket.io')(server ,{
transports: ['websocket']
});
io.on('connection', function(socket) {
socket.emit('socket connected')
//every time a new customer added on website end, new room is created
socket.on('new customer added', function(username) {
socket.broadcast.emit('new room', username)
})
});
server.listen(port);
客户端(管理面板)如下:
this.socketUrl = 'adminpanel.azurewebsites.net'
this.sockets['main'] = io.connect(this.socketUrl, {
transports: ['websocket']
});
this.sockets['main'].on('new room', (room) => {
this.sockets[room] = io.connect(this.socketUrl+'?token=' + room, {
transports: ['websocket']
});
});
在面板客户端,为每个新客户创建一个房间。
客户端(网站)如下:
this.socket = io.connect('adminpanel.azurewebsites.net?token=' + this.username, {
transports: ['websocket']
});
this.socket.emit('new customer added', this.username);
现在,问题是,这在localhost上可以正常使用,但在生产环境中,警告
与'wss://adminpanel.azurewebsites.net/socket.io/?token = Test%20Name&EIO = 3&transport = websocket'的WebSocket连接失败:在建立连接之前关闭WebSocket。
同时在管理面板和网站上显示,此后聊天停止。
此警告会出现几次,然后显示以下错误:
enter code here
WebSocket与'wss://adminpanel.azurewebsites.net/socket.io/?token = Test%20Name&EIO = 3&transport = websocket'的连接失败:WebSocket打开握手超时
调试之后,这就是我得到的:
engine.io-client:socket socket error {"type":"TransportError","description":{"isTrusted":true}} +4ms
socket.io-client:manager connect_error +8ms
socket.io-client:manager cleanup +4ms
socket.io-client:manager reconnect attempt error +5ms
socket.io-client:manager will wait 2154ms before reconnect attempt +3ms
engine.io-client:socket socket close with reason: "transport error" +19ms
engine.io-client:socket socket closing - telling transport to close +3ms
socket.io-client:manager attempting reconnect +2s
socket.io-client:manager readyState closed +2ms
socket.io-client:manager opening https://adminpanel.azurewebsites.net?token=Test Name +3ms
engine.io-client:socket creating transport "websocket" +2s
engine.io-client:socket setting transport websocket +3ms
socket.io-client:manager connect attempt will timeout after 20000 +10ms
socket.io-client:manager connect attempt timed out after 20000 +20s
engine.io-client:socket socket close with reason: "forced close" +20s
因此应用程序可以正常工作一段时间,但是会显示此警告,并且该应用程序将停止工作。
我无法弄清楚是什么原因导致此错误,以及如何阻止它发生。有办法解决这个问题吗?