Nodejs socket服务器,如何通过url向后端传递参数?

Nodejs socket服务器,如何通过url向后端传递参数?

如题。 搭建好socket.io 后,成功。看Network链接信息为: http://127.0.0.1:8081/socket.io/1/?t=1401081998752。 t参数是自动生成的,我如何多加一个参数,比如 : http://127.0.0.1:8081/socket.io/1/?t=1401081998752&token=232dsjfased3。

哪位之前碰到这样的问题,希望解答下。谢谢亲们。


9 回复

在使用 Node.js 和 Socket.IO 构建 WebSocket 服务器时,有时需要通过 URL 传递额外的参数来携带一些认证信息或配置信息。Socket.IO 允许你在连接时通过查询字符串传递这些参数。以下是如何实现这一功能的步骤及示例代码。

步骤

  1. 初始化 Socket.IO 服务器:创建一个基本的 Socket.IO 服务器。
  2. 客户端连接时传递参数:在客户端发起连接请求时,通过 URL 传递额外参数。
  3. 服务器接收并处理参数:在服务器端获取并处理这些参数。

示例代码

服务器端代码

首先,确保你已经安装了 socket.io 包:

npm install 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.on('connection', (socket) => {
    console.log('A user connected');

    // 获取查询字符串中的参数
    const query = socket.handshake.query;
    console.log('Query parameters:', query);

    // 例如,你可以访问 token 参数
    if (query.token) {
        console.log(`Received token: ${query.token}`);
    }

    // 处理其他逻辑...

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

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

客户端代码

在客户端,你可以这样连接到服务器并传递参数:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Socket.IO Client</title>
</head>
<body>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        const socket = io('http://127.0.0.1:8081', {
            query: { token: '232dsjfased3' }
        });

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

        socket.on('message', (data) => {
            console.log('Message from server:', data);
        });

        socket.on('disconnect', () => {
            console.log('Disconnected from server');
        });
    </script>
</body>
</html>

解释

  • 服务器端:我们监听 connection 事件,并通过 socket.handshake.query 访问客户端传递的查询字符串参数。
  • 客户端:在调用 io() 函数时,通过传递一个包含 query 属性的对象来传递参数。

通过这种方式,你可以在 Socket.IO 的连接过程中传递任何必要的参数,并在服务器端进行处理。


为什么要把参数放在链接里传回去??

因为我希望传入参数后,在Authorization里进行验证这个token。如果token不对,不让连接。不然,还可以从哪里把这个token传给后端socket。

socket没有接收参数的功能吧?这个是Http?

首先,这个url是用来保持socket的心跳的,其次,你可以把token设置在cookie里,然后在socket connect后检查handshake中cookie里的token,这样不就可以了??

谢谢。你说的这种方法在同一台服务器上可以实现了。但是,我们的这个比较特殊蛋疼:我们cookie跨域了,取不到。socket.io服务器放在另一台服务器b.com上,我们的js代码是在a.com上连接的。handshake中可以取到的cookie是b.com上的,取不到a.com上的。b.com的cookie我们不可写。我凌乱了。

恩。是的。貌似没找到。可以通过handshake的cookie来传递参数。

额,这样还是可以取的啊,(1)socket io里面改动Access头部 (2)crossdomain

要在Node.js中通过URL向Socket.io服务器传递额外参数(例如token),你可以利用Socket.io客户端初始化时提供的额外查询参数。下面是一些简化的示例代码来说明这一过程。

客户端代码

在客户端JavaScript中,当连接到Socket.io服务器时,可以通过向io()函数传入额外的参数来添加自定义查询字符串:

// 假设你的Socket.io服务器运行在localhost:8081
var socket = io('http://127.0.0.1:8081', {
    query: "token=232dsjfased3"
});

socket.on('connect', function () {
    console.log("Connected to the server!");
});

服务器端代码

在服务器端,你可以通过监听connection事件来接收这些额外参数。Socket.io服务器自动解析了查询字符串,并将其作为对象形式提供给回调函数中的第二个参数:

const io = require('socket.io')(8081);

io.on('connection', function(socket, query) { // 注意这里query参数
    console.log('A user connected.');
    console.log("Received token:", query.token); // 输出接收到的token

    // 你可以在这里使用query.token进行验证或其他逻辑处理
    socket.on('disconnect', function() {
        console.log('User disconnected.');
    });
});

这样,客户端就可以通过URL向服务器发送额外参数(如token),而服务器端可以接收到这些参数并根据它们执行相应的操作。这种方法非常适用于需要进行身份验证或会话管理的场景。

回到顶部