Nodejs socket.io怎么连接远程地址呢

Nodejs socket.io怎么连接远程地址呢

我想在我的页面(访问路径http://192.168.10.105:8080/abc或http://localhost:8080/abc)中通过socket.io去连接scoket 服务器,但是 io.connect好像有跨域的问题,不知道大家是怎么解决的呢 var chat1Socket = io.connect(‘http://192.168.10.105:9092/chat1’);//这个访问不成功,好像是跨域的问题 var chat2Socket = io.connect(‘http://127.0.0.1:9092/chat2’);//这个可以连接成功,用localhost和127.0.0.1都可以成功


7 回复

当然,可以为您提供一个关于如何在Node.js中使用socket.io连接到远程地址的解决方案。通常情况下,跨域问题可以通过服务器端配置来解决。下面我将提供一些示例代码,并解释如何设置。

示例代码

首先,确保你已经在服务器端安装了socket.io。如果还没有安装,可以通过npm安装:

npm install socket.io --save

服务器端代码

假设你的服务器运行在http://192.168.10.105:9092上:

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

// 允许所有来源的跨域请求
io.origins('*:*');

io.on('connection', (socket) => {
  console.log('A user connected');

  socket.on('disconnect', () => {
    console.log('User disconnected');
  });
});

server.listen(9092, () => {
  console.log('Server is running on port 9092');
});

这里我们通过io.origins('*:*')来允许所有的跨域请求。

客户端代码

在客户端,你可以这样连接到远程服务器:

<!DOCTYPE html>
<html>
<head>
  <title>Socket.IO Test</title>
  <script src="/socket.io/socket.io.js"></script>
  <script>
    var chat1Socket = io('http://192.168.10.105:9092');
    
    chat1Socket.on('connect', function() {
      console.log('Connected to server');
    });

    chat1Socket.on('disconnect', function() {
      console.log('Disconnected from server');
    });

    chat1Socket.on('message', function(msg) {
      console.log('Message received:', msg);
    });

    // 发送消息到服务器
    chat1Socket.emit('message', 'Hello Server!');
  </script>
</head>
<body>
  <h1>Socket.IO Test Page</h1>
</body>
</html>

解释

  • 服务器端:我们创建了一个简单的Express应用,并使用socket.io来处理WebSocket连接。io.origins('*:*')允许所有来源的连接,这有助于解决跨域问题。

  • 客户端:客户端通过指定服务器的URL(http://192.168.10.105:9092)来建立连接。一旦连接成功,就可以监听和发送事件。

通过这种方式,你可以轻松地从本地页面连接到远程的socket.io服务器,同时避免了跨域问题。


不用chat1

不用chat1也不可以,主要的问题是在访问地址IP和端口上

我现在也在研究这个问题。 其实单纯的靠socket.io去访问跨域是可行的,出问题的是session,也就是cookie 你socket.io服务端 io.set(‘authorization’, function (handshakeData, callback) { /*** } 肯定有这个认证,一旦跨域,handshakeData.headers.cookie是获取的服务器域的cookie. 而express的session管理也是将cookie记录在服务端里的,只有你访问服务端域的时候,cookie才会生成,这时才有所谓的session。 app.use(session({ resave: true, saveUninitialized: true, secret: config.session_option.secret, cookie: {maxAge: 1000 * 60 * 60 * 24 * 1}, store: storeMemory })); 在你服务端没有cookie记录的时候(默认为connectsid),直接通过客户端socket.io去远程链接是生成不了cookie的,同时也就获取不到,在认证这块就出了问题,所以就走不通。

还是找不到好的方案,

有好的方案吗?我也遇到socket远程跨域这个问题了

为了连接到远程Socket.IO服务器并解决跨域问题,你需要确保服务器端和客户端都正确配置。下面是详细的步骤和示例代码。

服务器端配置

首先,确保你的Socket.IO服务器允许跨域连接。这通常需要在Express应用中进行一些配置。假设你使用的是Express和Socket.IO

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

// 允许所有来源的跨域请求
io.origins('*:*');

io.on('connection', (socket) => {
    console.log('A user connected');
    socket.on('disconnect', () => {
        console.log('User disconnected');
    });
});

server.listen(9092, () => {
    console.log('Server is running on port 9092');
});

客户端配置

客户端需要指定正确的URL来连接到远程Socket.IO服务器。确保你的HTML文件中有正确的引用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Socket.IO Test</title>
    <script src="/socket.io/socket.io.js"></script>
</head>
<body>
    <script>
        var chat1Socket = io('http://192.168.10.105:9092/chat1');
        var chat2Socket = io('http://192.168.10.105:9092/chat2');

        chat1Socket.on('connect', () => {
            console.log('Connected to chat1 server');
        });

        chat2Socket.on('connect', () => {
            console.log('Connected to chat2 server');
        });
    </script>
</body>
</html>

注意事项

  1. 检查网络可达性:确保你的客户端能够通过网络访问到服务器。
  2. 防火墙和安全组:确保服务器端口(例如9092)在服务器上的防火墙中是开放的,并且在任何云提供商的安全组中也是开放的。
  3. CORS 配置:如果你的服务器是基于Express的,上面的配置应该足够。如果使用其他框架或直接使用Node.js,则可能需要额外的CORS中间件。

以上步骤应该能帮助你解决跨域问题并成功连接到远程Socket.IO服务器。

回到顶部