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 ...
随机推荐
- 在ASP.NET Core中如何支持每个租户数据存储策略的数据库
在ASP.NET Core中如何支持每个租户数据存储策略的数据库 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: ht ...
- The model backing has changed
其他信息: The model backing the 'WebTopFormContext' context has changed since the database was created. ...
- Yii 2.0 数据库操作总结
1. 概述 操作数据库有2种方式: DAO(data access object),不安全 ORM(onject relational mapping) 2. DAO Yii::app()->d ...
- 配置zabbix agent向多个server发送数据
1.背景: agent 端:dba-test-hzj02 172.16.59.197 server端:172.16.59.197 ,172.16.59.98 2.方式: 配置多个server,se ...
- HDU3336 Count the string
居然一A了,说明对朴素的KMP还是有一定理解. 主要就是要知道next数组的作用,然后就可以计算每个i结尾的满足题意的串个数. #include<cstdio> #include<c ...
- zoj 2136 Longest Ordered Subsequence 最长上升子序列 新思路
Longest Ordered Subsequence Time Limit: 2 Seconds Memory Limit: 65536 KB A numeric sequence of ...
- 51nod 1522 上下序列
题目描述 现在有1到n的整数,每一种有两个.要求把他们排在一排,排成一个2*n长度的序列,排列的要求是从左到右看,先是不降,然后是不升. 特别的,也可以只由不降序列,或者不升序列构成. 例如,下面这些 ...
- win10 UWP Hmac
HMAC是密钥相关的哈希运算消息认证码,输入密钥和信息. 在uwp,Hmac在很多网络使用,我最近写qiniu SDK,把原来C#改为UWP,需要使用HMAC. 上传文件 <form metho ...
- C#编译器和CLI的安装
为了完成C#程序编译和运行,需要安装代码对应版本的编译器和CLI(公共语言框架)平台. (部分内容摘自<C#本质论>) 针对主流的CLI平台(Microsoft .NET),有两种安装方案 ...
- java传值与传引用总结
基本数据类型 我们先来看一个代码 public class ParamTest { public static void main(String[] arge) { double percent = ...