Я использую angular 4, Express 4.16.3 и Socket.IO 2.1.1 для создания механизма чата для панели администратора поддержки, где команда поддержки, используя панель администратора, может общаться с клиентами на веб-сайте, для которого я использую один сервер на стороне панели администратора и 2 клиента, где один клиент снова находится на панели администратора для группы поддержки и другой находится на стороне веб-сайта для клиентов.
У меня есть два поддомена (один для панели и один для веб-сайта) и я ссылаюсь на этот ответ, поскольку мне нужно было решение для междоменного подключения в socket.io
Сервер находится на adminpanel.azurewebsites.net
Мои два клиенты развернуты в обоих субдоменах:
клиент веб-сайта на веб-сайте website.azurewebsites.net и
клиент панели (поддержки) на adminpanel.azurewebsites.net
И я также включил CORS на adminpanel.azurewebsites.net (заголовок Access-Control-Allow-Origin установлен на *), и я включил веб-сокеты на портале azure. Оба моих приложения 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);
Теперь проблема в том, что это отлично работает на локальном хосте, но на производстве предупреждение
Ошибка подключения WebSocket к wss://adminpanel.azurewebsites.net/socket.io/?token=Test%20Name&EIO=3&transport=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
Таким образом, приложения какое-то время работают нормально, но появляется это предупреждение, и приложение перестает работать.
Я не могу понять, что вызывает эту ошибку и как я могу предотвратить ее появление. Есть ли способ обойти эту проблему?