WebSocket小插件
一.WebSocket小介绍
随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据。
我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据;这种客户端是主动方,服务端是被动方的传统Web模式 对于信息变化不频繁的Web应用来说造成的麻烦较小,而对于涉及实时信息的Web应用却带来了很大的不便,如带有即时通信、实时数据、订阅推送等功能的应 用。在WebSocket规范提出之前,开发人员若要实现这些实时性较强的功能,经常会使用折衷的解决方法:轮询(polling)和Comet技术。其实后者本质上也是一种轮询,只不过有所改进。
轮询是最原始的实现实时Web应用的解决方案。轮询技术要求客户端以设定的时间间隔周期性地向服务端发送请求,频繁地查询是否有新的数据改动。明显地,这种方法会导致过多不必要的请求,浪费流量和服务器资源。
Comet技术又可以分为长轮询和流技术。长轮询改进了上述的轮询技术,减小了无用的请求。它会为某些数据设定过期时间,当数据过期后才会向服务端发送请求;这种机制适合数据的改动不是特别频繁的情况。流技术通常是指客户端使用一个隐藏的窗口与服务端建立一个HTTP长连接,服务端会不断更新连接状态以保持HTTP长连接存活;这样的话,服务端就可以通过这条长连接主动将数据发送给客户端;流技术在大并发环境下,可能会考验到服务端的性能。
这两种技术都是基于请求-应答模式,都不算是真正意义上的实时技术;它们的每一次请求、应答,都浪费了一定流量在相同的头部信息上,并且开发复杂度也较大。
伴随着HTML5推出的WebSocket,真正实现了Web的实时通信,使B/S模式具备了C/S模式的实时通信能力。WebSocket的工作流程是这 样的:浏览器通过JavaScript向服务端发出建立WebSocket连接的请求,在WebSocket连接建立成功后,客户端和服务端就可以通过 TCP连接传输数据。因为WebSocket连接本质上是TCP连接,不需要每次传输都带上重复的头部数据,所以它的数据传输量比轮询和Comet技术小 了很多。本文不详细地介绍WebSocket规范,主要介绍下WebSocket在Java Web中的实现。
二.WebSocket兼容性
三.WebSocket应用场景
随着直播的兴起,以及现在社会发展的进步,更为重要的是浏览器的更新换代,世界互联网技术的发展。WebSocket应用会越来越广泛。下面是我近期写的一个WebSocket小插件,能够满足一般的需求。
现在为大家分享一下,多谢大家指正。
//lk-2017-05-04
var _websocket ={
option:{
websocket:window.WebSocket || window.MozWebSocket,
websockets:'',
_websocket_des:'',
url:'',
},
init:function(url,send,message){
if(this.option.websocket){
window.onbeforeunload=function(){
_websocket.option._websocket_des.close();
}
this.option.url=url;
if(send && Object.prototype.toString.call(send)=="[object Function]") this.option.send=send;
if(message && Object.prototype.toString.call(message)=="[object Function]") this.option.message=message;
if(this.option.message && this.option.send){
return this.main(url,send,message);
}else if(this.option.message){
return this.main(url,false,message);
}else if(this.option.send){
return this.main(url,send,false);
}else{
return this.main(url);
} }else{
return '当前设备不支持'
}
},
doopen:function(){
console.log('链接open')
},
doclose:function(){
console.log('链接close');
_websocket.option._websocket_des.close();
},
doError:function(){
console.log('链接出错')
},
doMessage:function(message){
console.log('收到message='+message);
},
doSend:function(message){
if(this.readyState==1) {
this.send(JSON.stringify(message));
} else {
console.log("您已经掉线,无法与服务器通信!");
}
},
Reconnect:function(){
return _websocket.main(_websocket.option.url,_websocket.option.send,_websocket.option.message);
},
main:function(wcUrl,send,message){
this.option.websockets = new this.option.websocket(encodeURI(wcUrl));
this.option.websockets.onopen = this.doopen;//打开
this.option.websockets.onerror = this.doError;//出错
this.option.websockets.onclose = this.doclose;//关闭
this.option.websockets.onmessage = (message || this.doMessage);//接收
this.option.websockets.onSend= (send || this.doSend);//发送
this.option.websockets.Reconnect = this.Reconnect;//重新连接
this.option._websocket_des=this.option.websockets;
return this.option.websockets;
} }
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>websocket-demo</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<style type="text/css">
#msges{
width: 220px;
height: 35px;
border: 1px solid #ccc;
border-radius: 5px;
text-indent: 10px;
}
#btn{
margin-left: 15px;
height: 35px;
width: 65px;
border: none;
background-color: rebeccapurple;
border-radius: 5px;
color: #fff;
}
#list{
background-color: #D1DBE5;
padding: 10px;
height: 300px;
overflow-y: auto;
}
p{
font-size: 25px;
width: 120px;
line-height: 50px;
padding: 0;
margin: 0;
}
</style>
</head>
<body onkeydown="keyLogin();">
<input type="text" id="msges" placeholder="请输入消息" /><input id="btn" type="button" onclick="webs.onSend()" value="发送" />
<p>消息列表</p>
<div id="list"> </div>
<script type="text/javascript" src="js/websocket.js" ></script>
<script>
var wurl='ws://192.168.109.53:8080/ssm/websocket';
var webs=_websocket.init(wurl,function(){ //console.log('send1') JSON.stringify(sends) if(webs.readyState==1) {
var sends=document.getElementById("msges").value;
webs.send(sends|| '你输入的是什么?');
document.getElementById("msges").value='';
}else{
console.log('已断开链接');
webs=webs.Reconnect();
} },function(msgges){
//console.log('msgges1');
document.getElementById("list").innerHTML+=msgges.data+ '<br/>';
}); function keyLogin(){
event.keyCode==13?webs.onSend():'';
}
</script>
</body>
</html>
效果如图:
小伙伴们,这只是前端代码哦!!需要后端支持提供接口才可以长连接的。
websocket连接个数
Tomcat的WebSocket最大连接数为200。chrome最多连接256个。
总结:
websocket以后肯定是互联网发展的趋势,可实时显示数据,保证数据的准确性与后端的一致性。上边贴出的js代码不是最好的,如果一个页面链接一个 websocket足够您使用,如果一个页面需要链接多个 websocket,你还需要联系我或者你自己在重新封装。嘿嘿!
WebSocket小插件的更多相关文章
- 开源Unity小插件CheatConsole
我们在开发游戏的过程中,通常都需要一些快捷的方式来进行一些非常规的测试,这些功能一般被称作控制台或者GM指令,比如虚幻竞技场中,可以使用~键呼出控制台,输入一些指令即可进行快捷设置,比如设置分辨率,全 ...
- 浮动【电梯】或【回到顶部】小插件:iElevator.js
iElevator.js 是一个jquery小插件,使用简单,兼容IE6,支持UMD和3种配置方式,比锚点更灵活. Default Options _defaults = { floors: null ...
- aBowman >>可以运用到自己博客上的小插件
大家进入我的博客会发现页面右边有一只小狗这部分.这个就是我用在上面的 一个小插件.插件网址是:http://abowman.com/google-modules/,这上面有很多的小插件,可以直接运用到 ...
- 移动端全屏滑动的小插件,简单,轻便,好用,只有3k swiper,myswiper,page,stage
https://github.com/donglegend/mySwiper mySwiper 移动端全屏滑动的小插件,简单,轻便,好用,只有3k 下载 直接下载 bower install mySw ...
- 查看SQLSERVER内部数据页面的小插件Internals Viewer
原文:查看SQLSERVER内部数据页面的小插件Internals Viewer 查看SQLSERVER内部数据页面的小插件Internals Viewer 感觉internals viewer这个名 ...
- 仿javascript中confirm()方法的小插件
10天没有写博客了,不知道为什么,心里感觉挺不舒服的,可能这是自己给自己规定要去完成的事情,没有按照计划执行,总会心里不怎么舒服.最近事情挺多的,终于今天抽空来更新一下博客了. 今天写的是一个小插件. ...
- 闲聊select和input常用的小插件
前言 在pc端的项目中,经常会用到表单标签,莫过于是select和input这两种,这两种相当常用.但往往原生的功能不尽人意,即使 input中type有n多属性,甚至连时间控件都有,但仍旧满足不了我 ...
- 【Bootstrap】优秀小插件收集
Bootstrap中不乏很多优秀的小插件来让界面更加漂亮.比如之前做过笔记的bootstrap-fileinput,select2,datetimepicker等都是属于这一系列的.这些相对而言比较大 ...
- Android桌面小插件——Widget
Android桌面小插件--Widget 效果图 实现 1. 创建Widget类 创建一个Widget类,并实现页面创建的时候,就实现显示时间 package com.kongqw.kqwwidget ...
随机推荐
- CentOS 搭建Graylog集群详解
1. Graylog2 简介 Graylog 是一个简单易用.功能较全面的日志管理工具,相比 ELK 组合, 优点: 部署维护简单,一体化解决方案,不像ELK三个独立系统集成. 查相比ES json语 ...
- JavaScript设计模式接口
JavaScript中实现接口的方法有三种: 第一种,使用注释的方法实现接口 特点:(1)最简单,但是功能最弱(2)利用 interface和 implement"文字"(3)把他 ...
- Java高新技术 注解
Java高新技术 注解 知识概要: (1)了解注解 (2)注解的应用结构图 (3)@Retention(RetentionPolicy.RUNTIME) ...
- 【学习】js学习笔记:对象的一些基础知识
1.创建对象 //构造函数方法 function fun1(){} var obj=new fun1(); //Object方法,O要大写 var obj1=new Object(); //json方 ...
- 原生js反转字符串
//直接操作 var str='nama';var rts=str.split('').reverse().join(''); //String上拓展方法String.prototype.revers ...
- 彻底区分html的attribute与dom的property
当初在学html时始终没有弄清楚的关于attribute与property的区别,竟然在看angular文档时弄明白了. angular官方文档的数据绑定一节提到html attribute与dom ...
- RT5350 OpenWrt 系统移植jsoncpp
下载Json包: 下载地址:http://sourceforge.net/projects/jsoncpp/ 如:jsoncpp-src-0.5.0.tar.gz 交叉编译: 1.解压jsoncpp- ...
- Spring批量更新batchUpdate提交和Hibernate批量更新executeUpdate
1:先看hibernate的批量更新处理. 版本背景:hibernate 5.0.8 applicationContext.xml 配置清单: <?xml version="1.0&q ...
- 突发小事件,USB接口问题
昨天遇到的突发事件,突然USB接口全部瘫了,键盘鼠标全部不能用,换到别人电脑上可以,吓尿了,以为本子主板挂了,但是发现插U盘竟然可以识别而且可以打开,感觉可能是静电问题,果然,彻底关机,拔掉电池,然后 ...
- Java反射机制(Reflect)解析
一.导读 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计 ...