我正在尝试使用nodejs和socket.io实现聊天应用程序。该应用程序可在localhost上运行。但是,当我在生产服务器上部署同一个产品时,socket.io无法建立任何连接。
server.js的代码
var express = require('express');
var app = express();
var socket = require('socket.io');
var chat_controller = require('./controllers/ChatController.js');
var user_controller = require('./controllers/UserController.js');
var Group_controller = require('./controllers/GroupChatController.js');
app.get('/search', function (req, res) {
user_controller.get(req, res);
});
app.get('/groupSearch', function (req, res) {
user_controller.get(req, res);
});
var server = app.listen(3600, function () {
var host = server.address().address
var port = server.address().port
console.log("Example app listening at http://%s:%s", host, port)
});
var io = socket(server);
io.on('connection', (socket) => {
console.log('made socket connection', socket.id);
socket.broadcast.emit('userconnected');
chat_controller.respond(io, socket);
Group_controller.respond(io, socket);
user_controller.respond(io, socket);
});
io.on('disconnect', function () {
console.log('made socket disconnect', socket.id);
});
client.js的代码
var socket = io.connect('https://www.mywebsite.com', {
path: '/apichat'
});
/* Other events related to socket. */
我的服务器使用SSL时,我无法直接使用IP:PORT,因此我将ProxyPass用作
ProxyPass / apichat http://127.0.0.1:3600
服务器和客户端之间仍未建立所有静态套接字连接。
浏览器控制台中显示的错误是:
POST https://www.mywebsite.com/apichat/?EIO=3&transport=polling&t=MUc-TJK 404(未找到)
在浏览器的“网络”标签中,它显示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot POST /</pre>
</body>
</html>
我检查了此处和其他网站上发布的许多其他问题,但没有任何问题解决此问题。
请帮助。
答案 0 :(得分:1)
您遇到的问题可能是由于您网站上启用了ssl。 您需要在app.js文件中传递与ssl相关的文件。示例代码如下:
var fs = require('fs');
var options = {
key: fs.readFileSync('PATH_TO_SSL_KEYS.key'),
cert: fs.readFileSync('PATH_TO_SSL_CERTS.crt'),
ca: fs.readFileSync('PATH_TO_SSL.pem')
};
var app = require('https').createServer(options, handler), io = require('socket.io').listen(app);
io.set('transports', [
'websocket',
'flashsocket',
'htmlfile',
'xhr-polling',
'jsonp-polling',
'polling'
]);
function handler(req, res) {
res.writeHead(200);
res.end("welcome sir!");
}
var chat_controller = require('./controllers/ChatController.js');
var user_controller = require('./controllers/UserController.js');
io.sockets.on('connection', function (socket) {
socket.broadcast.emit('userconnected');
chat_controller.respond(io, socket);
user_controller.respond(io, socket);
socket.on('message', function (data) {
socket.broadcast.emit('message', data);
});
});
io.on('disconnect', function (socket) {
console.log('made socket disconnect', socket.id);
});
app.listen(3300);
尝试根据上述示例代码编辑您的应用程序文件,然后尝试使用它。如果无法获取ssl相关文件的路径,则需要与系统管理员或托管提供商联系。
我希望它能帮上忙。