【问题标题】:nodejs, socket, https - Socket makes no connection but only disconnectsnodejs, socket, https - 套接字不建立连接,只是断开连接
【发布时间】: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


【解决方案1】:

由于最近更新到 v3.0.0,版本 2.x.x 客户端不兼容,因此无法连接。

修复方法是确保客户端和服务器都使用相同的版本,或者使用服务器提供的版本/socket.io/socket.io.js(这并不总是可能的,webpack 等)

github上的相关问题:https://github.com/socketio/socket.io-client/issues/1390

【讨论】:

  • 谢谢!这就是我的解决方案:-)
猜你喜欢
  • 2021-12-21
  • 2016-05-31
  • 1970-01-01
  • 2022-11-10
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多