Nodejs中socket.io在IE6下,智能发送一次请求

Nodejs中socket.io在IE6下,智能发送一次请求

socket.io模块在 IE6下 测试 ,连接服务器成功 第一句话 发送成功 发送第二句话服务器没接收任何数据 ,此后就服务器寄再也接收不到IE6发过来的数据 , 但仍然可以接收服务器信息 !不明真相 求高手解释 !ie7 发送接收正常!

4 回复

Node.js 中 socket.io 在 IE6 下只能发送一次请求

问题描述

在使用 socket.io 模块时,发现一个奇怪的现象:在 IE6 下,客户端能够成功连接到服务器并发送第一条消息,但之后就无法再发送任何消息。不过,客户端仍然可以接收到服务器端发送的消息。

原因分析

这个问题主要与 IE6 的一些特性有关。IE6 对 WebSocket 和 HTTP 长轮询的支持存在一些限制。当客户端尝试使用这些技术进行通信时,可能会出现一些异常情况。

解决方案

为了确保 socket.io 能够在 IE6 下正常工作,我们需要对连接方式和事件处理进行一些调整。以下是可能的解决方案:

  1. 配置 socket.io 使用 XHR-Pollingsocket.io 默认会自动选择最佳的传输方式。但在某些情况下,手动指定传输方式可以解决兼容性问题。我们可以强制 socket.io 使用 XHR-Polling 方式。

  2. 添加重连机制: 确保客户端在断开连接后能够自动重新连接。

示例代码

// 服务器端代码 (Node.js)
const io = require('socket.io')(server);

io.set('transports', ['xhr-polling']); // 强制使用 XHR-Polling

io.on('connection', function(socket) {
    console.log('Client connected:', socket.id);

    socket.on('message', function(data) {
        console.log('Received message:', data);
        socket.broadcast.emit('message', data); // 广播给其他客户端
    });

    socket.on('disconnect', function() {
        console.log('Client disconnected:', socket.id);
    });
});

// 客户端代码 (HTML + JavaScript)
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>

<script>
    var socket = io.connect('http://yourserver.com', { transports: ['xhr-polling'] });

    socket.on('connect', function () {
        console.log('Connected to server');
        setInterval(function() {
            socket.emit('message', 'Hello from client');
        }, 5000); // 每5秒发送一条消息
    });

    socket.on('message', function(data) {
        console.log('Received message:', data);
    });

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

总结

通过强制 socket.io 使用 XHR-Polling 方式,并添加适当的重连机制,可以解决 IE6 下 socket.io 只能发送一次请求的问题。此外,确保客户端和服务器端的代码正确处理连接和断开事件,以保证通信的稳定性。


代码如下。。。

前端: socket.on(‘news’, function (data){ alert(data.size); });

function sdd(){
    var socket = io.connect();
    socket.emit('pp', { my: 'data' });
}

后台:

var sss = 0; io.sockets.on(‘connection’,function(socket){ socket.on(‘pp’, function (data) { var xdd = setInterval(function(){ if(sss<11){ sss++; socket.emit(‘news’, { size: sss }); }else{ sss = 0; clearInterval(xdd); } },10);

    });
socket.on('disconnect',function(){
    console.log("DISCONNECTED FROM CLIENT");
});

});

0.0有人帮下么?

这个问题可能是由于IE6对长轮询(long-polling)的支持不完善导致的。Socket.IO 默认使用多种传输方式,其中一种是长轮询。IE6 在处理长轮询时可能会出现问题。

解决方法:

  1. 限制传输方式: 可以通过配置 Socket.IO 仅使用 jsonp-polling,这样可以避免长轮询的问题。

  2. 使用最新的 Socket.IO 版本: 确保使用的是最新版本的 Socket.IO,因为新版本可能已经修复了IE6的兼容性问题。

示例代码:

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

// 配置 Socket.IO 仅使用 jsonp-polling
io.set('transports', ['jsonp-polling']);

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

    socket.on('message', function(msg) {
        console.log('Message received: ' + msg);
        socket.emit('response', 'Server received your message: ' + msg);
    });

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

server.listen(3000, function() {
    console.log('Server is listening on port 3000');
});

客户端代码:

<!DOCTYPE html>
<html>
<head>
    <title>Socket.IO Test</title>
    <script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
</head>
<body>
    <input type="text" id="message" placeholder="Type a message...">
    <button onclick="sendMessage()">Send</button>

    <script>
        var socket = io.connect('http://localhost:3000', { transports: ['jsonp-polling'] });

        function sendMessage() {
            var msg = document.getElementById('message').value;
            socket.emit('message', msg);
            document.getElementById('message').value = '';
        }

        socket.on('response', function(data) {
            alert(data);
        });
    </script>
</body>
</html>

解释:

  1. 服务端

    • 使用 io.set('transports', ['jsonp-polling']) 来限制 Socket.IO 使用 jsonp-polling 传输方式。
    • 监听客户端的消息并返回响应。
  2. 客户端

    • 使用 io.connect 连接到服务器,并指定使用 jsonp-polling
    • 当用户点击按钮时,发送消息到服务器。
    • 接收服务器的响应并显示一个弹窗。

这样可以确保在 IE6 下也能正常工作。

回到顶部