【转】Web实时通信之Socket.IO ,真正的兼容ie

2024-06-02 14:18

本文主要是介绍【转】Web实时通信之Socket.IO ,真正的兼容ie,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Socket.IO简介

为了解决浏览器的兼容问题,不是所有的环境都可以使用WebSocket,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:通过此处可以下载例子的源码。

from:http://www.cnblogs.com/wilber2013/p/4814838.html

备注:看了好多例子,对我来说只有这个才是真正的兼容

这篇关于【转】Web实时通信之Socket.IO ,真正的兼容ie的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024208

相关文章

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

JavaWeb系列二十: jQuery的DOM操作 下

jQuery的DOM操作 CSS-DOM操作多选框案例页面加载完毕触发方法作业布置jQuery获取选中复选框的值jQuery控制checkbox被选中jQuery控制(全选/全不选/反选)jQuery动态添加删除用户 CSS-DOM操作 获取和设置元素的样式属性: css()获取和设置元素透明度: opacity属性获取和设置元素高度, 宽度: height(), widt

使用JWT进行安全通信

在现代Web应用中,安全通信是至关重要的。JSON Web Token(JWT)是一种流行的安全通信方式,它允许用户和服务器之间安全地传输信息。JWT是一种紧凑的、URL安全的表示方法,用于在两方之间传输信息。本文将详细介绍JWT的工作原理,并提供代码示例帮助新人理解和实现JWT。 什么是JWT? JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSO

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项和细节 Servlet注

JavaWeb 学习笔记 spring+jdbc整合开发初步

JdbcTemplate类是Spring的核心类之一,可以在org.springframework.jdbc.core中找到它。JdbcTemplate类在内部已经处理数据库的建立和释放,可以避免一些常见的错误。JdbcTemplate类可直接通过数据源的应用实例化,然后在服务中使用,也可在xml配置中作为JavaBean应用给服务使用直接上一个实例步骤1.xml配置 <?xml version

Java——IO流(一)-(5/8):IO流概述、字节流-FileInputStream 每次读取一个字节

IO流概述 介绍 输入输出流,用于读写数据。 I指Input,称为输入流:负责把数据读到内存中去。 O指Output,称为输出流:负责写数据出去。 IO流的应用场景 文件内容的读写永久保存应用数据复制粘贴对话通信等等 怎么学IO流 理清楚IO六点分类和体系循序渐进、深入学习每个IO流的作用和用法 IO流的分类 IO流总体来看就有四大类: 字节输入流:以内存

Web容器启动时加载Spring分析

在应用程序web.xml中做了以下配置信息时,当启动Web容器时就会自动加载Spring容器。 [java]  view plain copy print ? <listener>          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

物联网系统运维——移动电商应用发布,Tomcat应用服务器,实验CentOS 7安装JDK与Tomcat,配置Tomcat Web管理界面

一.Tomcat应用服务器 1.Tomcat介绍 Tomcat是- -个免费的开源的Ser Ivet容器,它是Apache基金会的Jakarta 项目中的一个核心项目,由Apache, Sun和其他一 些公司及个人共同开发而成。Tomcat是一一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。 在Tomcat中,应用程序的成部署很简

Linux C/C++ socket函数

目录 socket函数 函数原型 头文件 功能 返回值 参数 错误码 socket函数 函数原型 int socket(int domain, int type, int protocol); 头文件                 #include <sys/types.h>                 #include <sys/socket.h>