【发布时间】:2020-11-07 14:39:40
【问题描述】:
我在这里遇到了很多关于这个主题的问题,但到目前为止还没有答案能解决我的问题。
我的设置是安装了 apache 的 AWS EC2 服务器。我已经在包含名为server.js 的服务器文件的/node 文件夹中安装了node.js,在根文件夹中我有我的客户端文件index.php。我的域有 Let´s Encrypt SSL 证书,因此我需要一切都通过 https 运行。我已经为 AWS 上的所有流量开放了 3000 端口。
Server.js
const app = require('express')();
const fs = require('fs');
const options = {
key: fs.readFileSync("/etc/letsencrypt/live/example.com/privkey.pem"),
cert: fs.readFileSync("/etc/letsencrypt/live/example.com/fullchain.pem")
};
const http = require('https').Server(options, app);
const io = require('socket.io')(http);
io.on('connection', (socket) => {
socket.on('chat message', (msg) => {
console.log('message: ' + msg);
});
});
http.listen(3000, function(){
console.log('listening on 3000');
});
index.php
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Socket Test</title>
</head>
<body>
<ul id="events"></ul>
<script src="https://cdn.jsdelivr.net/npm/socket.io-client@2/dist/socket.io.js"></script>
<script>
const events = document.getElementById('events');
const newItem = (content) => {
const item = document.createElement('li');
item.innerText = content;
return item;
};
const socket = io('https://example.com:3000', {transports: ['websocket', 'polling']});
console.log(socket);
socket.on('connect', () => {
console.log("did connect");
events.appendChild(newItem('connect'));
});
socket.on('disconnect', () => {
console.log("did disconnect");
});
</script>
</body>
</html>
问题
当我启动节点服务器时,一切似乎都正常。执行node server.js 按预期返回listening on 3000。当我转到 index.php 时,它永远不会返回 did connect 但是当我退出服务器节点时,我会在浏览器控制台中收到 did disconnect 消息。
此外,除了listening on 3000,服务器从不返回任何其他内容。
请帮帮我:-)
【问题讨论】:
-
控制台网络选项卡中的任何错误?,最近 semvar 对 v3.0.0 进行了重大更新,如果服务器使用 v3,v2.x.x 客户端将无法连接
-
尝试改成
https://cdn.jsdelivr.net/npm/socket.io-client@3.0.0/dist/socket.io.min.js或者使用服务器的客户端https://example.com:3000/socket.io/socket.io.js -
将脚本更改为cdn.jsdelivr.net/npm/socket.io-client@3.0.0/dist/… 修复了所有问题!哇..这花了我两天的调试时间。非常感谢!如果您将评论添加为答案,我将接受它作为解决方案。 :-)
-
np,我也遇到过
标签: javascript node.js sockets https socket.io