【问题标题】:Node.js, socket, io and HTTPSNode.js、socket、io 和 HTTPS
【发布时间】:2017-08-21 01:21:14
【问题描述】:

我正在制作一个白板应用程序:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

io.on('connect', function(socket) {
  socket.on('join', function(data) {
    socket.join(data.room);
    console.log(data.room);
  });

  socket.on('drawing', function(data) {
    console.log(data);
    io.sockets.in(data.room).emit("senddraw", data);
  });

  socket.on('writetext', function(data) {
    console.log(data);
    io.sockets.in(data.room).emit("senddraw", data);
  });

  socket.on('action', function(data) {
    console.log(data);
    io.sockets.in(data.room).emit("action", data);
  });

});

http.listen(8080, function() {
  console.log('listening on localhost:8080');
});

如果我在我的服务器上运行这个节点脚本,我可以通过我的网页的本地主机副本进行连接。但是,我无法从服务器上托管的副本连接,因为它是通过 HTTPS 提供的。我得到错误:

polling-xhr.js:264 混合内容:位于 ***** 的页面通过 HTTPS 加载,但请求了不安全的 XMLHttpRequest 端点 'http://。..*:8080/socket.io/?EIO=3&transport=polling&t=Lu2NoGL'。此请求已被阻止;内容必须通过 HTTPS 提供。

如何在不禁用服务器上的 ssl 的情况下解决此问题?

客户端有相当于:

  //var socket = io.connect("http://localhost:8080");
  var socket = io.connect("http://**.***.***.**:8080");

  socket.on("connect", function(data) {
    socket.emit("join", {room : "@roomid"});
  });

关于绘图事件:

socket.emit("drawing", {x0 : x0, y0 : y0, x1 : x1, y1: y1, current : current, room : "@roomid"});

由以下人员挑选:

socket.on("drawing", function(data) {do blah});

【问题讨论】:

  • 嘿,你有这方面的更新吗?我也遇到了类似的问题

标签: node.js https


【解决方案1】:

您需要通过连接到/ 而不是http://...*:8080 来更改网页javascript 中的socket.io client 代码:

var socket = io.connect('/');

【讨论】:

  • 谢谢。这是为什么?。我是否还需要将我的 ssl 证书提供给我的 server.js 文件?
  • 你不需要对server.js做任何事情我希望(实际上我通常使用nginx代替ssl而不是由应用程序代码处理。关于io.connect('/'),它相当于io.connect('http://localhost') 如果您在localhost 上运行,则等效于io.connect('https://*:8080') 如果您在远程服务器上运行。它会自动选择当前的protocol 和host 作为默认值。
  • 这给了我错误:XMLHttpRequest cannot load http://**.**.***.***/socket.io/?EIO=3&transport=polling&t=LuCTNdr。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'localhost' 不允许访问。响应的 HTTP 状态代码为 404。当我在本地测试时,节点服务器在我的真实服务器上运行。
【解决方案2】:

我在我的通知实现中使用 socket.io 解决了这个问题

我的 socket.io 服务器(节点)在 8001 端口

我的应用程序使用 ssl 并通过 https 提供服务

广泛的步骤:

1. using reverse proxy in my virtualhost apache configurations to point all socket.io requests to my node server at 8001
2. sending requests from socket.io client to host = wss://domain.com:443/
3. using same version i.e. 4.0.0 of socket.io client and socket.io server

我使用的反向代理配置:

        RewriteEngine On
        RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
        RewriteCond %{QUERY_STRING} transport=websocket    [NC]
        RewriteRule /(.*)           ws://localhost:8001/$1 [P,L]

        ProxyPass /socket.io http://localhost:8001/socket.io connectiontimeout=600 timeout=600
        ProxyPassReverse /socket.io http://localhost:8001/socket.io

使用本指南: https://www.serverlab.ca/tutorials/linux/web-servers-linux/how-to-reverse-proxy-websockets-with-apache-2-4/

socket.io 客户端实现:

function createSocket(host) {
        return io(host);
    }
    function init() {
        var host = "wss://mydomain.com:443/";
        try {
            socket = createSocket(host);
            console.log('3');

            socket.on("connect", () => {
                console.log('In Connect');
            });

socket.io 服务器实现

const app = require("express")();
const server = require("http").createServer(app);

const io = require("socket.io")(server, {
cors: {
origin: '*',
}, 'pingTimeout': 180000, 'pingInterval': 25000,
});

io.on("connection", (socket) => {
  console.log("Connected!");
  socket.on("message", data => {
              console.log("in message with data: "+data.topic);
              pubClient.publish('notification', data);
            });
});

server.listen(8001);

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    相关资源
    最近更新 更多