websocket上手,应用websocket广播同步客户端信息
2015-08-24 10:08
726 查看
本文内容基于nodejs,简单搭建node服务可参考
/article/1899993.html
websocket实现了浏览器与服务器全双工通信,允许多个客户端同时和服务器进行通信,也允许客户端主向多个客户端发送信息
1.安装socket模块
如果我们要使用websocket,需要先给服务器安装socket模块,
例如给node的服务文件server3.js,安装socket
cmd控制台cd切换到server3.js目录下,执行命令npm install socket.io
安装完毕后,在server3.js的目录下,多了一个node_modules文件夹。
这个文件夹就是socket模块的目录。
然后在server3.js文件开头引入socket.io:
2.在server3.js文件中给http监听对象添加socket监听
var socket = io.listen(httpServer);//httpServer是http监听
3.客户端发送socket请求
假设index.html页面为客户端,如果要向服务端发送socket连接请求
首先得引入client.socket.js文件
再创建socket连接
4.监听socket连接事件
例子:应用websocket广播同步客户端信息
例子功能:
在客户端设置一个”连接socket”按钮和一个div,
当客户端1(用浏览器窗口代替不同客户端)点击连接socket按钮,就会得到来自服务器的“欢迎你”提示。
当客户端2点击连接socket按钮,也会得到“欢迎你”提示,此时客户端1会得到”有新人进来了”。
当客户端3点击连接socket按钮,也会得到“欢迎你”提示,此时客户端1和2会得到”有新人进来了”的提示。
另外,当一个客户端点击socket按钮,那么该客户端上的红色div可以拖动,而且会把位置信息传递给其他连接了socket的客户端,其他客户端的红色div也会运动到相对位置。
功能分析 :
“欢迎你”的提示来自服务器,只要服务器端出发了socket的connection监听事件,就让服务器端的socket发送hello事件给对应的客户端。
客户端接收到hello事件,用socket.on()方法捕获hello事件,打印data数据即可。
而服务器端的广播事件,
流程也和上面的普通emit事件一样,但是他发送给的是已建立的所有连接,所以所有已经连接的客户端都能捕捉到a事件。就能打印”有新人进来了”
div同步拖动: 一个客户端拖动div的时候,记录位置,将其以move监听事件的形式emit到服务器
然后服务器再把位置广播到所有客户端,实现位置同步
下面是整体代码
index.html:
server3.js:
/article/1899993.html
websocket实现了浏览器与服务器全双工通信,允许多个客户端同时和服务器进行通信,也允许客户端主向多个客户端发送信息
1.安装socket模块
如果我们要使用websocket,需要先给服务器安装socket模块,
例如给node的服务文件server3.js,安装socket
cmd控制台cd切换到server3.js目录下,执行命令npm install socket.io
安装完毕后,在server3.js的目录下,多了一个node_modules文件夹。
这个文件夹就是socket模块的目录。
然后在server3.js文件开头引入socket.io:
[code]var io = require('socket.io');
2.在server3.js文件中给http监听对象添加socket监听
var socket = io.listen(httpServer);//httpServer是http监听
3.客户端发送socket请求
假设index.html页面为客户端,如果要向服务端发送socket连接请求
首先得引入client.socket.js文件
再创建socket连接
[code]var scoket = io.connect('http://localhost:8888');//协议不能丢
4.监听socket连接事件
[code]//socket代表的是当前服务端和客户端建立的对象(TCP) //socket.sockets对象监听connection事件,只要有一个客户端进行了 //socket对象连接,就会执行function函数内容 socket.sockets.on('connection',function(){ //这里写wsocket连接后的事件 //socket基本方法: socket.emit(event1,data);//向客户端发送event1事件,并传输data socket.on(event2,function(data){ //接收客户端发来的event2事件,并得到传输来data //根据事件名和data数据进行下一步的操作 }); socket.broadcast.emit(event3,data); //向所有客户端广播event1事件,并传输data });
例子:应用websocket广播同步客户端信息
例子功能:
在客户端设置一个”连接socket”按钮和一个div,
当客户端1(用浏览器窗口代替不同客户端)点击连接socket按钮,就会得到来自服务器的“欢迎你”提示。
当客户端2点击连接socket按钮,也会得到“欢迎你”提示,此时客户端1会得到”有新人进来了”。
当客户端3点击连接socket按钮,也会得到“欢迎你”提示,此时客户端1和2会得到”有新人进来了”的提示。
另外,当一个客户端点击socket按钮,那么该客户端上的红色div可以拖动,而且会把位置信息传递给其他连接了socket的客户端,其他客户端的红色div也会运动到相对位置。
功能分析 :
“欢迎你”的提示来自服务器,只要服务器端出发了socket的connection监听事件,就让服务器端的socket发送hello事件给对应的客户端。
[code]socket.emit('hello','欢迎你');
客户端接收到hello事件,用socket.on()方法捕获hello事件,打印data数据即可。
而服务器端的广播事件,
[code]socket.broadcast.emit('a','有新人进来了');
流程也和上面的普通emit事件一样,但是他发送给的是已建立的所有连接,所以所有已经连接的客户端都能捕捉到a事件。就能打印”有新人进来了”
div同步拖动: 一个客户端拖动div的时候,记录位置,将其以move监听事件的形式emit到服务器
[code]scoket.emit( 'move', '{"left":'+oDiv.offsetLeft+',"top":'+oDiv.offsetTop+'}' );
然后服务器再把位置广播到所有客户端,实现位置同步
[code]socket.on('move',function(data){ socket.broadcast.emit('moveto',data); });
下面是整体代码
index.html:
[code]<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> <style> #div1{width: 100px;height: 100px;background-color: red;position: absolute; top:30px;left: 100px;} </style> <script src="client.socket.js"></script> <script> window.onload=function(){ var oBtn = document.getElementsByTagName('input')[0]; var scoket = null; var oDiv = document.getElementById('div1'); oBtn.onclick= function(){ drag(oDiv); scoket = io.connect('http://localhost:8888'); scoket.on('hello',function(data){ alert(data); }); scoket.on('moveto',function(data){ var data = JSON.parse(data); var L = data.left; var T = data.top; oDiv.style.left = L+'px'; oDiv.style.top = T+'px'; }); scoket.on('a',function(data){ //console.log(1); alert(data); }); function drag(obj){ obj.onmousedown = function(ev){ var ev = ev||event; var disX = ev.clientX - obj.offsetLeft; var disY = ev.clientY - obj.offsetTop; document.onmousemove=function(ev){ var L = ev.clientX - disX; var T = ev.clientY -disY; obj.style.left = L+'px'; obj.style.top = T+'px'; scoket.emit('move','{"left":'+oDiv.offsetLeft+',"top":'+oDiv.offsetTop+'}'); } document.onmouseup = function(ev){ document.onmousemove = document.onmouseup = null; } return false; } } } } </script> </head> <body> <h1>这里是主页</h1> <input type="button" value="发送socket" /> <div id = "div1"></div> </body> </html>
server3.js:
[code]var http = require('http'); var fs = require('fs'); var io = require('socket.io'); var documentRoot = 'E:/PhpProject/html5/websocket/www'; var httpServer = http.createServer(function(req,res){ var url = req.url; var file = documentRoot + url; console.log(url); fs.readFile( file , function(err,data){ if(err){ res.writeHeader(404,{ 'content-type' : 'text/html;charset="utf-8"' }); res.write('<h1>404错误</h1><p>你要找的页面不存在</p>'); res.end(); }else{ res.writeHeader(200,{ 'content-type' : 'text/html;charset="utf-8"' }); res.write(data); res.end(); } }); }).listen(8888); var socket = io.listen(httpServer); socket.sockets.on('connection',function(socket){ //socket代表的是当前服务端和客户端建立的对象(TCP) socket.emit('hello','欢迎你'); socket.broadcast.emit('a','有新人进来了'); socket.on('move',function(data){ socket.broadcast.emit('moveto',data); }); });
相关文章推荐
- 【LeetCode】(59)Spiral Matrix II(Medium)
- [Loadrunner参数化]一个文件输两列参数的取值
- 原生js解决跨浏览器兼容问题
- jQuery插件Jeditable的使用(Struts2处理)
- Servlet中的过滤器Filter详解
- document.write和innerHTML的区别
- Windows后台运行python程序
- 学习人分类感悟
- Linux安装redis
- 【POJ3159】【差分系统】【dij+priority_queue】
- 枚举
- fir.im Weekly - 新开发时代,每个人都在创造
- HDU1215
- Design Pattern Command 命令设计模式
- quartz 关联多个JobDetail和SimpleTrigger多任务调度
- ORA-01788: 此查询块中要求 CONNECT BY 子句
- jquery性能优化高级技巧
- javascript实现支持移动设备画廊
- Unity3D游戏开发之详解 Animation类和Animator类
- android-如何关闭AlertDialog.Builder对话框