在生产服务器上部署时使用socket.io的聊天应用程序未连接

时间:2018-12-13 09:56:19

标签: node.js socket.io chat

我正在尝试使用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>

我检查了此处和其他网站上发布的许多其他问题,但没有任何问题解决此问题。

请帮助。

1 个答案:

答案 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相关文件的路径,则需要与系统管理员或托管提供商联系。

我希望它能帮上忙。