长话短说; 在本地主机和 http 上开发我的代码时,socket.io 运行良好,可以在我的客户端和服务器之间来回通信。
现在我实现了 NGINX 并添加了 SSL 代理,socket.io 似乎与服务器成功连接,但没有听到或“触发”任何事件。
这是 NGINX 的 error.log 文件显示的内容
2018/04/01 15:58:45 [error] 31893#0: *772 connect() failed (111: Connection refused) while connecting to upstream, client: XXX.XXX.XXX.XXX, server: .com, request: "GET /socket.io/?EIO=3&transport=polling&t=MA1xgon HTTP/2.0", upstream: "http://127.0.0.1:8000/socket.io/?EIO=3&transport=polling&t=MA1xgon", host: ".com", referrer: "https://.com/"
这是我的服务器 WebSocket 文件:
import * as socketIo from 'socket.io';
let io;
export class WebSocket {
static setServer(server): void {
io = socketIo(server);
io.on('connection', (socket) => {
console.log('new connection');
socket.on('sessionData', (data) => {
console.log('Session Data event received');
try {
data = JSON.parse(data);
} catch(e) {
console.log('Unable to parse JSON data', data);
return;
}
console.log('Permission ID: ' + data.perm_id);
io.emit('CON-' + data.perm_id, JSON.stringify(data));
});
})
}
}
这是我的主服务器类,其中 socket.io 连接到端口 8000
import * as express from 'express';
import * as http from 'http';
import * as cors from 'cors';
import * as Passport from 'passport';
import * as bodyParser from 'body-parser';
import * as fileUpload from 'express-fileupload';
import {AuthStrategy} from './includes/passport-strategy';
import {WebSocket} from './includes/ws';
import {Database} from './includes/database';
const app = express();
// Middleware go here
Passport.use('jwt', AuthStrategy);
app.use(Passport.initialize());
app.use(cors());
app.use(bodyParser.json());
app.use(fileUpload());
const server = http.createServer(app);
WebSocket.setServer(server);
server.listen(8000, function(){
console.log('Server is running...');
Database.connect().then(() => {
console.log('Connected to SQL...');
// Database.initializeDB().then(success => { console.log('success');}).catch(err => {
// console.log(err);
// });
}).catch( err => {
console.log(err);
console.log('error connecting to DB, make sure credentials entered are correct (secureaccessserver/Mavis/src/main/Server/includes/config.txt)');
})
});
现在这是我的客户端试图发送到我的 socket.io 服务器
pathToSocket = 'https://' + window.location.hostname + '/socket.io/';
// I've also tried pathToSocket = 'https://' + ..... + '/server/' with same results
socket = io(this.pathToSocket);
terminateConnection(): void {
const Permission = this.sessionService.getPermission();
this.socket.emit('sessionData', JSON.stringify({
perm_id: Permission.perm_id,
terminate: true
}));
}
最后是我的 nginx 配置文件
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name cracenter.com www.cracenter.com;
ssl_certificate "/root/cracenter.com.crt";
ssl_certificate_key "/root/cracenter.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
include /etc/nginx/default.d/*.conf;
location /server/ {
proxy_pass "http://127.0.0.1:8000";
}
location /socket.io/ {
proxy_pass "http://127.0.0.1:8000/socket.io/";
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
}
现在,当我运行服务器并启动我的客户端(它运行在同一个云服务器上,只是不同的端口)。我成功地获得了“新连接”控制台日志(来自 websocket 文件代码)但是“ session 数据无论我尝试在服务器代码中触发“terminateConnection”函数多少次,都不会在控制台中打印“收到事件”
最佳答案
你有 const server = http.createServer(app);
而你也许应该有 const server = https.createServer(app);
关于node.js - 当 HTTPS 时,Socket.io 连接但从不监听任何事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49600670/