socket.io 是一个为nodejs开发的socket通信用的lib
要使用 socket.io , 首先要安装nodejs , mac下面我直接用brew安装了(或者ports 以及 源码编译):javascript
brew install nodejs
安装好了以后 , 咱们须要安装一下express, express提供一点基础工具来开发一个页面:css
sudo npm install --save express
安装完成能看到提醒 没有安装好的话 会出现一堆ERROR , 通常是目录写入权限问题 , 别忘了 sudo 。html
有了express以后 先写一个基本页面: ( index.js )前端
var express = require('express'); var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); app.use(express.static(__dirname + '/app')); app.use('/bower_components', express.static(__dirname + '/bower_components')); app.get('/' , function(req , res){ res.sendFile(__dirname + '/index.html'); });
这里我用了 bower来安装页面须要用到的jquery bootstrap , 因为静态文件目录解析的须要 因此加了java
app.use(express.static(__dirname + '/app')); app.use('/bower_components', express.static(__dirname + '/bower_components'));
这行代码。node
接下来我要要建立 模板文件: (index.html)
这个以前咱们要用bower安装前端模板须要的js库
raphael raphael.sketchpad jquery json2jquery
bower install http://libs.baidu.com/jquery/1.8.3/jquery.js bower install http://github.com/DmitryBaranovskiy/raphael/raw/master/raphael-min.js bower install http://ianli.com/sketchpad/javascripts/raphael.sketchpad.js bower install bootstrap bower install git@github.com:douglascrockford/JSON-js.git
若是你还没安装bower 那就赶忙装一个吧(不用bower不要意思说本身作web开发的):git
sudo npm install -g bower
而后就是index.html模板的内容:github
<!doctype html> <html> <head> <title>Socket.IO chat</title> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <link href="/bower_components/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="/socket.io/socket.io.js"></script> <script src="/bower_components/jquery.min/index.js"></script> <script src="/bower_components/raphael-min/index.js"></script> <script src="/bower_components/raphael.sketchpad/index.js"></script> <script src="/bower_components/JSON-js/json2.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-6"> <div style="border: 1px solid #336699;border-radius: 10px;margin: 10px;" id="draw-pad"></div> </div> <div class="col-md-6" id="draw-pad-copy"></div> </div> </div> <script> var socket = io(); //渲染一个区域 而后让它能够随意被涂鸦 var sketchpad = Raphael.sketchpad('draw-pad' , { width: "100%" , height: 400 , editing: true }); //渲染一个相同的区域 用来同步显示数据 var sketchpad_viewer = Raphael.sketchpad("draw-pad-copy", { width: "100%" , height: 400 , editing: false }); //当画笔开始画画的时候 传递数据到socket sketchpad.change(function(){ //传递数据的方法是 socket.emit() //sketchpad.json()是涂鸦以后生成的json数据 用这个json数据能够渲染出同样的图 socket.emit('drawing' , sketchpad.json()); //sketchpad_viewer.json(sketchpad.json()); }); //socket监听 若是服务器发送了新的数据 利用raphael.sketchpad插件立刻渲染出来 socket.on('drawing_back' , function(data){ sketchpad_viewer.json(data); //console.log(data); }); </script> </body> </html>
这是客户端的操做 , 已经完成了 , 能够发送数据 , 能够接收数据 。web
服务端咱们须要一个相似的操做 , 即接收客户端emit来的数据 而后用相同的方法发送到全部的客户端:
io.on('connection' , function(socket){ //接收而后再发送 socket.on('drawing' , function(data){ io.emit('drawing_back' , data); }); });
这个操做跟客户端的差很少
完整的index.js :
var express = require('express'); var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); app.use(express.static(__dirname + '/app')); app.use('/bower_components', express.static(__dirname + '/bower_components')); app.get('/' , function(req , res){ res.sendFile(__dirname + '/index.html'); }); io.on('connection' , function(socket){ socket.on('drawing' , function(data){ io.emit('drawing_back' , data); }); }); http.listen('12138' , function(){ console.log('server start at :12138'); });
而后启动:
node index.js //或者用forever 安装方法 sudo npm install forever forever start index.js
就能够看到效果了