关于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?是我哪里配置错了吗?
关于Nodejs中socket.io的transports问题
你好!你在使用socket.io时遇到了一个关于transports的问题。你提到每次请求的transport参数都是polling
,而不是websocket
。这可能是因为socket.io客户端在尝试连接时会根据网络环境选择最适合的传输方式。如果你希望优先使用WebSocket,可以通过一些配置来实现。
示例代码
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');
});
解释
-
明确指定支持的传输方式:
- 在创建socket.io实例时,你可以通过传递一个配置对象来指定支持的传输方式。在这个例子中,我们将
transports
设置为['polling', 'websocket']
,这意味着socket.io会先尝试使用polling
,如果可行的话,再尝试使用websocket
。
- 在创建socket.io实例时,你可以通过传递一个配置对象来指定支持的传输方式。在这个例子中,我们将
-
客户端代码:
- 确保你的客户端代码正确地初始化了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.io
是upgrade
上去的吧.
如果浏览器不支持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。
希望这些信息对你有所帮助!