WebSocket 初体验
其实老早就觊觎 Socket 这碗美食了,在 WebSocket 发出后更是心潮澎湃...
奈何这需要后端同志的帮助,使得至今才得以品尝。(当然本文也只涉及前端部分)
以前想监听其他设备变化,大屏幕交互,还有客服,多设备游戏等,
用过轮询(特定的时间间隔请求一次),后来也受教使用长链接(后端实现链接 1s 内不断,断了再请求)
但总要为性能这事捏一把汗,
而 Socket/WebSocket 就是即时通信,就是能很好的完成上述需求呀,
啊哈哈哈,不禁笑出了声音...
好的,回归正题,先看封装代码
function Socket(url, options) {
var opt = $.extend({
onopen: function(e){},
whenGet: function(val){},
onreset: function(){},
beforeClose: function(){},
onclose: function(){}, // (注:此处已不能再传输,为关闭后运行)
}, options || {});
var wsImpl = window.WebSocket || window.MozWebSocket;
var socket = new wsImpl(url);
// 关闭或刷新页面时,也关闭 socket
var DispClose = true;
$(window).on('beforeunload', CloseEvent);
$(window).on('unload', UnLoadEvent);
function _close() {
opt.beforeClose.apply(this, arguments);
socket.close();
}
function CloseEvent() {
if (DispClose) return "是否离开当前页面?";
_close();
}
function UnLoadEvent() {
DispClose = false;
_close();
}
// WebSocket 本身事件
socket.onopen = function(){
opt.onopen.apply(this, arguments);
}
socket.onclose = function(){
opt.onclose.apply(this, arguments);
}
socket.onmessage = function(){
opt.whenGet.apply(this, arguments);
}
socket.onerror = function(e){
console.log(e);
}
// 外放的其他方法
return {
send: function(val) {
socket.send(val);
},
reset: function(){
socket = new wsImpl(url);
opt.onreset.apply(this);
},
close: _close,
};
}
演示地址: http://sum.kdcer.com/test/SocketGame/
技术难点:
1. 从后端那搞到 ws:// 格式的 url
2. 处理好 whenGet 的传值,可以看看演示的源码,这个就看需求,相当考逻辑了
但还有个小问题就是 socket 延时/主动断开的情况,beforeClose 就不运行了,也就不能传输告诉别人我挂了,这个很尴尬
敲黑板,WebSocket 是个好东西,大家快用起来吧,一起研究哈
WebSocket 初体验的更多相关文章
- websocket初体验(小程序)
之前上个公司做过一个二维码付款功能,涉及到websocket功能,直接上代码 小程序onShow方法下加载: /** 页面的初始数据 **/ data: { code: "", o ...
- websocket初体验
(function (window) { var wsUri = "ws://echo.websocket.org:9150"; var output; MyWebSocket = ...
- (一)SpringBoot基础篇- 介绍及HelloWorld初体验
1.SpringBoot介绍: 根据官方SpringBoot文档描述,BUILD ANYTHING WITH SPRING BOOT (用SPRING BOOT构建任何东西,很牛X呀!),下面是官方文 ...
- SpringBoot初体验及原理解析
一.前言 上篇文章,我们聊到了SpringBoot得以实现的幕后推手,这次我们来用SpringBoot开始HelloWorld之旅.SpringBoot是Spring框架对“约定大于配置(Conv ...
- (一)SpringBoot2.0基础篇- 介绍及HelloWorld初体验
1.SpringBoot介绍: 根据官方SpringBoot文档描述,BUILD ANYTHING WITH SPRING BOOT (用SPRING BOOT构建任何东西,很牛X呀!),下面是官方文 ...
- Django3.0 异步通信初体验
此前博主曾经写过一篇博文,介绍了Django3.0的新特性,其中最主要的就是加入对ASGI的支持,实现全双工的异步通信. 2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我 ...
- Django3.0 异步通信初体验(小结)
2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我们来尝试一下吧! (附ASGI官方文档地址:https://asgi.readthedocs.io/en/latest/e ...
- .NET WebSockets 核心原理初体验
上个月我写了<.NET gRPC核心功能初体验>, 里面使用gRPC双向流做了一个打乒乓球的Demo, 实时双向这两个标签是不是很熟悉,对, WebSockets也可以做实时双向通信. 本 ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
随机推荐
- linux USR1亦通常被用来告知应用程序重载配置文件
linux kill 命令 以及 USR1 信号 解释 原创 2016年03月16日 16:48:27 标签:linux kill -USR1 5325 最近 在做 服务器搭建的一些工作,其中 用到了 ...
- Java bean 是个什么概念?
Java语言欠缺属性.事件.多重继承功能.所以,如果要在Java程序中实现一些面向对象编程的常见需求,只能手写大量胶水代码.Java Bean正是编写这套胶水代码的惯用模式或约定.这些约定包括getX ...
- Hbuilder MUI 注册短信验证60秒后重新发送
<div class="mui-input-row"> <label class="iconfont_log_reg icon-youjian" ...
- HTML5实现端访问时禁止放大和缩小网页
<title>html5禁止和移动.缩放网页</title><meta name="viewport" content="width=dev ...
- Xcode中授权普通成员
问题: 在普通用户账户下使用系统的Xcode在编译通过时候会提示” Developer Tools Access“需控制另一进程,需要输入“Developer Tools”组用户名密码才能继续调试 解 ...
- makefile编写---单个子目录编译自动变量模板ok
1.自动化变量通配符http://blog.sina.com.cn/s/blog_7c95e5850101b38l.html 2.wildcard 使用http://blog.csdn.net/lia ...
- MFC多国语言——配置文件
前段时间,因工作需要,本地化了一个英文版本的产品. 在网上查阅了若干资料,在此进行一个简单的整理. 在MFC程序中,实现多国语言的方式很多,我们选择的是使用配置文件的方法. 在通过配置文件方式实现多国 ...
- Python中threading的join和setDaemon的区别及用法[例子]
Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别. 1.join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join() ...
- 如何解决mac下MAMP不能重启apache server的问题
第一步:检查问题 在终端输入:sudo /Applications/MAMP/Library/bin/apachectl start 终端会提示你那个目录下的那个文件出现了什么问题 第二步:逐一排 ...
- ubuntu 16.04 系统语言汉化
转载自:https://jingyan.baidu.com/article/5553fa82cedaa265a2393420.html