Web实时通信Socket.IO兼容浏览器版本IE7&IE8&IE9&IE10

由于浏览器的兼容问题,不是所有的环境都可以使用WebSocket这种比较好的方式。也就是说,根据浏览器或者环境的不同,客户端和服务端可能需要使用不同的通信方式。

Socket.IO简介

为了解决上面的问题,Socket.IO就出现了。

Socket.IO是一个基于Nodejs的,用于实时通信的一个软件包(包括client端和server端),Socket.IO完全由JavaScript实现。

Socket.IO设计的目标是支持任何的浏览器,任何设备。在接口方面,Socket.IO统一了通信的API,在内部实现上支持WebSocket,AJAX long-polling, AJAX multipart streaming, Forever Iframe等方式。也就是说,Socket.IO会根据环境来选择适合的通信方式。

在Socket.IO中,还有namespace和room的概念,可以方便的对socket进行分组,方便的实现一些例如聊天室的应用。

关于更多Socket.IO相关的内容,请参考该链接。

好吧,又是聊天程序,这次是Socket.IO版本。

实现

在实现方面,客户端直接使用Socket.IO 的client,服务器端使用Nodejs。

客户端

客户端首先创建一个socket对象,这个socket对象会监听”new_message”和”user_status”事件。

var socket;

function initSocket(){
     socket = io("http://" + location.host);

     socket.emit("add_client", $("#clientNameSpan").text());

     socket.on("new_message", function(data){
         console.log(data);
         data = eval("(" + data + ")");
         if (data.sender == $("#clientNameSpan").text()){
             $("#inbox").append("<div class='chatItemS'><span class='msg mSend'><span class='sender'>"+data.sender+": </span>"+data.msg+"</span></div>");
         }
         else {
             $("#inbox").append("<div class='chatItemR'><span class='msg mRecv'><span class='sender'>"+data.sender+": </span>"+data.msg+"</span></div>");
         }
         $("#inbox").scrollTop($("#inbox")[0].scrollHeight);
     });

     socket.on("user_status", function(data){
         $("#clientCount").text("Online User: "+data.length);
         $("#clients").children().remove();
         for(var i = 0; i<data.length; i++){
             $("#clients").append("<span id='client'>"+data[i]["clientName"]+"</span>")
         }
     })
 }

服务端

对于服务端,首先是一些静态文件、页面的处理。

// get the static files
app.get("/", function(req, res){
    res.sendFile(__dirname + "/index.html");
});

app.get("/static/jquery-1.11.3.js", function(req, res){
    res.sendFile(__dirname + "/static/jquery-1.11.3.js");
});

app.get("/static/json2.js", function(req, res){
    res.sendFile(__dirname + "/static/json2.js");
});

app.get("/static/style.css", function(req, res){
    res.sendFile(__dirname + "/static/style.css");
});

另外,服务端主要的功能就是接收消息,然后广播消息。

服务端会根据socket id和用户名记录所有的用户,并存放在一个数组中。每当有用户加入或者用户退出,服务端就通过”user_status”事件将用户数组发送给客户端,这样客户端就能展示当前在先用户数。

// save all the client {"sid": socket.id, "clientName": client}
var clients = []

io.on("connection", function(socket){

    socket.on("add_client", function(client){
        console.log(client+" jion the chat");

        var clientObj = {};
        clientObj["sid"] = socket.id;
        clientObj["clientName"] = client;

        clients.push(clientObj);
        io.emit("user_status", clients)
    });

    socket.on("new_message", function(msg){
        console.log("Server got message: "+msg);
        console.log("Send message using: "+socket.conn.transport.name);
        io.emit("new_message", msg);
    });

    socket.on("disconnect", function(){
        for(var i = 0; i<clients.length; i++){
            if(clients[i]["sid"] == socket.id){
                console.log(clients[i]["clientName"]+" leave the chat");
                clients.splice(i, 1);
                break;
            }
        }
        io.emit("user_status", clients);
    });

});

运行效果

首先是一个login页面,在服务端会将用户名跟socket id绑定,用来进行简单的用户统计。
这里写图片描述

这里写图片描述

Console端打印了服务器收到的消息,以及用户的join/leave情况。

这里写图片描述

当用户状态改变后,页面会收到”user_status”事件,然后更新用户状态栏。
这里写图片描述

Socket.IO兼容性测试

前面提到了Socket.IO的优势就是统一了接口,对用户屏蔽了底层,同时能够支持不同的设备,选择最优的通信方式。

下面就对Socket.IO的兼容性进行一些简单的测试,主要看看IE7-10。

首先,注意服务端的下面一段代码,用于显示当前传递消息的通信方式:

console.log("Send message using: "+socket.conn.transport.name);
IE10

我本机安装的是IE10,通过服务端console可以看到,在IE10中Socket.IO会选择”WebSocket”为最终通信方式。
这里写图片描述

IE9/IE8

打开IE,通过F12进入下面页面,然后设置为IE9。

这里写图片描述

通过测试可以看到,Socket.IO在IE9中可以正常工作,由于IE9不支持“WebSocket”,所以Socket.IO最终选择了”Polling”为最终通信方式。
这里写图片描述

通过上面的设置切换到IE8模式,由于IE8不支持“WebSocket”,所以Socket.IO就会将通信方式切换到了“Polling”。

IE7

通过同样的步骤测试,Socket.IO在IE7中使用polling方式正常工作。

IE7中唯一遇到的问题是“JSON.stringify”方法不支持,所以通过下面方式对IE7进行了hack:

<!--[if IE 7]>
    <script src="/static/json2.js"></script>
<![endif]-->

总结

从例子中可以看到,使用了Socket.IO后,我们只需要了解Socket.IO提供的API,而不需要关心使用哪种通信方式,使用起来简单、方便。

文中对Socket.IO在IE上的兼容性做了一些简单的测试,结果还是很满意的,对于不支持WebSocket的环境,Socket.IO自动切换到了polling方式,用户不用去关心环境的差异了。

Socket.IO作为一个跨环境,多种连接方式自动切换的工具,进一步简化了Web实时通信方面应用的开发。

Ps:通过此处可以下载例子的源码。

Socket.IO简介
实现
客户端
服务端
运行效果
Socket.IO兼容性测试
IE10
IE9/IE8
IE7
总结
作者:田小计划
出处:http://www.cnblogs.com/wilber2013/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果觉得不错,请点击推荐和关注!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Socket.IO是一个实时应用程序框架,它允许服务器和客户端之进行双向通信。它提供了一种简单而强大的方式来构建实时应用程序,包括聊天应用、实时分析、实时协作等。 UniApp是一个基于Vue.js的跨平台开发框架,可以同时开发iOS、Android和Web应用。它提供了一套统一的API和组件,使得开发者可以使用一套代码构建多个平台的应用。 在UniApp中使用Socket.IO,你可以通过以下步骤进行配置和使用: 1. 安装Socket.IO库:在UniApp项目中,可以使用npm或者yarn安装Socket.IO库。在项目根目录下执行以下命令: ``` npm install socket.io-client ``` 2. 创建Socket.IO实例:在需要使用Socket.IO的页面或组件中,引入Socket.IO库,并创建一个Socket.IO实例。示例代码如下: ```javascript import io from 'socket.io-client'; // 创建Socket.IO实例 const socket = io('http://your-server-url'); ``` 3. 监听事件:通过Socket.IO实例,你可以监听服务器发送的事件,并在事件触发时执行相应的逻辑。示例代码如下: ```javascript // 监听服务器发送的消息事件 socket.on('message', (data) => { console.log('收到消息:', data); }); ``` 4. 发送事件:通过Socket.IO实例,你可以向服务器发送事件,并传递相应的数据。示例代码如下: ```javascript // 发送消息事件 socket.emit('message', 'Hello, server!'); ``` 这样,你就可以在UniApp中使用Socket.IO进行实时通信了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值