关于Nodejs中socket.io的transports问题

关于Nodejs中socket.io的transports问题

http://chat.test.dev/socket.io/?EIO=3&transport=polling&t=1414721238895-58&sid=l8DJsXIKuqt2NdKdAAAB 弄了一个聊天室,用chrome访问,通过F12开发工具看到每次transport都是polling,难道每次聊天首发消息都用的是轮询吗?而没有使用websocket?是我哪里配置错了吗?


7 回复

关于Nodejs中socket.io的transports问题

你好!你在使用socket.io时遇到了一个关于transports的问题。你提到每次请求的transport参数都是polling,而不是websocket。这可能是因为socket.io客户端在尝试连接时会根据网络环境选择最适合的传输方式。如果你希望优先使用WebSocket,可以通过一些配置来实现。

示例代码

首先,确保你已经安装了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, {
  transports: ['polling', 'websocket'] // 明确指定支持的传输方式
});

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

  socket.on('chat message', (msg) => {
    io.emit('chat message', msg); // 广播消息给所有连接的客户端
  });

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

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

解释

  1. 明确指定支持的传输方式

    • 在创建socket.io实例时,你可以通过传递一个配置对象来指定支持的传输方式。在这个例子中,我们将transports设置为['polling', 'websocket'],这意味着socket.io会先尝试使用polling,如果可行的话,再尝试使用websocket
  2. 客户端代码

    • 确保你的客户端代码正确地初始化了socket.io连接。例如:
    const socket = io('http://chat.test.dev', {
      transports: ['polling', 'websocket']
    });
    
    socket.on('connect', () => {
      console.log('Connected to the server');
    });
    
    socket.on('chat message', (msg) => {
      console.log('Message received:', msg);
    });
    
    document.getElementById('send-button').addEventListener('click', () => {
      const message = document.getElementById('message-input').value;
      socket.emit('chat message', message);
    });
    

通过上述配置,socket.io客户端会在连接时尝试使用WebSocket,如果WebSocket不可用,则会回退到轮询(polling)方式。

希望这些信息对你有所帮助!如果有其他问题,请随时提问。


可否贴代码出来,链接打不开

代码太多了,就是官网的一个例子, 我下载下来部署到了公司的服务器,访问官网的就没问题。

有人知道吗

socket.ioupgrade上去的吧. 如果浏览器不支持Websocket,那就只能polling了.

其实你要在客户端和服务器端都要设置下transports,为websocket https://github.com/Automattic/engine.io/blob/master/lib/server.js#L43

在Node.js中使用socket.io时,默认情况下,客户端会尝试使用WebSocket进行通信。但如果浏览器不支持WebSocket或WebSocket连接失败,socket.io会自动回退到其他传输方式,如长轮询(polling)。

在你的案例中,Chrome可能由于某些原因未能建立WebSocket连接,因此socket.io自动选择了轮询作为传输方式。这并不一定表示配置错误,而是socket.io为了保证兼容性和可靠性而设计的一种机制。

示例代码

你可以通过以下方式来明确指定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:', socket.id);
    
    socket.on('message', (data) => {
        console.log('Message received:', data);
        socket.broadcast.emit('message', data); // 广播给所有其他用户
    });
});

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

客户端代码

在客户端,你可以手动设置传输方式:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Socket.IO Test</title>
</head>
<body>
    <input type="text" id="msgInput" placeholder="Type a message...">
    <button onclick="sendMessage()">Send</button>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        const socket = io({ transports: ['websocket'] }); // 明确指定使用WebSocket
        
        function sendMessage() {
            const msg = document.getElementById('msgInput').value;
            socket.emit('message', msg);
        }
        
        socket.on('message', (data) => {
            console.log('Received:', data);
        });
    </script>
</body>
</html>

在这个示例中,客户端明确指定了使用websocket作为传输方式。如果WebSocket不可用,可以改为['polling', 'websocket']以先尝试轮询再尝试WebSocket。

希望这些信息对你有所帮助!

回到顶部