socket.io 是一个为nodejs开发的socket通讯用的lib
要使用 socket.io , 首先要安装nodejs , mac下面我直接用brew安装了(或者ports 以及 源码编译):
brew install nodejs
安装好了之后 , 我们需要安装一下express, express提供一点基础工具来开发一个页面:
sudo npm install --save express
安装完成能看到提醒 没有安装好的话 会出现一堆ERROR , 一般是目录写入权限问题 , 别忘了 sudo 。
有了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 , 由于静态文件目录解析的需要 所以加了
app.use(express.static(__dirname + '/app'));
app.use('/bower_components', express.static(__dirname + '/bower_components'));
这行代码。
接下来我要要创建 模板文件: (index.html)
这个之前我们要用bower安装前端模板需要的js库
raphael raphael.sketchpad jquery json2
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开发的):
sudo npm install -g bower
然后就是index.html模板的内容:
<!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>
这是客户端的操作 , 已经完成了 , 可以发送数据 , 可以接收数据 。
服务端我们需要一个类似的操作 , 即接收客户端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
就可以看到效果了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。