Socket.io系列三 文档之概括

如何使用


安装:


npm install socket.io


和node.js的http模块一起使用:


服务端(app.js):

var app = require('http').createServer(handler);
var io = require('socket.io')(app);
var fs = require('fs');

function handler(req,res){
	fs.readFile(__dirname+'/index.html',
		function(err,data){
			if(err){
					res.writeHead(500);
					return res.end('Error loading index.html')
			}
			res.writeHead(200);
			res.end(data);
		});
}
app.listen(80);

io.on('connection',function(socket){
	socket.emit('news',{hello:'world'});
	socket.on('my other event',function(data){
		console.log(data);
	})
});

客户端(index.html):

<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io('http://localhost');
socket.on('news',function(data){
  console.log(data);
  socket.emit('my other event',{my:'data'});
});
</script>

使用express框架3/4:


服务端(app.js):

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);

app.get('/',function(req,res){
	res.sendfile(__dirname+'/index.html');
});

io.on('connection',function(socket){
	socket.emit('news',{hello:'world'});
	socket.on('my other event',function(data){
		console.log(data);
	})
});

客户端(index.html):

<span style="font-size:18px;"><script src="/socket.io/socket.io.js"></script>
<script>
var socket = io('http://localhost');
socket.on('news',function(data){
  console.log(data);
  socket.emit('my other event',{my:'data'});
});
</script></span>


使用express框架:(暂时不知道与上个真正意义的区别,并且此次测试服务端无法运行)


服务端(app.js):


var app = require('express').createServer();
var io = require('socket.io')(app);

app.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

客户端(index.html):

<span style="font-size: 18px;"><script src="/socket.io/socket.io.js"></script>
<script>
var socket = io('http://localhost');
socket.on('news',function(data){
  console.log(data);
  socket.emit('my other event',{my:'data'});
});
</script></span>

发送和接收事件

socket.io允许你自定义发送和接收事件的名称,除了‘connect’,'message','disconnect':

//io.listen会创建一个http 服务器
var io = require('socket.io')(80);

io.on('connection',function(socket){
	io.emit('this',{will:'be received by everyone'});
	socket.on('private message',function(from,msg){
		console.log('I received a private message by',from,'saying',msg);
		socket.on('disconnect',function(){
			io.sockets.emit('user disconnected');
		});
	});
})

用命名空间来限制

如果在一个应用上你想控制所有的信息和事件,默认或者是命名空间都可以。如果你想借助第三方代码、分享代码给他人,socket.io提供了命名空间。

服务端(app.js):

//io.listen会创建一个http 服务器
var io = require('socket.io')(80);

var chat = io.of('chat').on('connection',function(socket){
	socket.emit('a message',{
		that:'only',
		'/chat':'will get'
	});
	chat.emit('a message',{
		everyone:'in',
		'chat':'will get'
	})
})
var news = io.of('/news').on('connection',function(socket){
	socket.emit('item',{news:'item'});
});

客服端(index.html):
<script>
var chat = io.connect('http://localhost/chat'),
    news = io.connect('http://localhost/news');

chat.on('connect',function(){
  chat.emit('hi');
})
news.on('news',function(){
  news.emit('woot');
});
</script>


发送易变的信息

有时一些确定的信息被发送,我们称你有一个实时显示基于关键词bieber的应用。


如果客户端没有准备去接收信息(因为网络延迟或者其他问题,或者他通过长连接已经连接了并且在一个轮询中),如果他没有接收到所有发出的信息,你应用时糟糕。

这种情况下,你应以把信息作为变动的信息发送出去。

服务端:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  var tweets = setInterval(function () {
    getBieberTweet(function (tweet) {
      socket.volatile.emit('bieber tweet', tweet);
    });
  }, 100);

  socket.on('disconnect', function () {
    clearInterval(tweets);
  });
});

注意:这个地方官网上省略了 getBieberTweet()函数的声明。
根据参考http://runnable.com/UTlPMF-f2W1TAAAo/sending-volatile-messages-for-socket-io,getBieberTweet()函数如下:
function getBieberTweet(cb) {
  cb('check out iambieber.com');
}

’index.js中的tweet为‘check out iambieber.com’。实际上getBieberTweet函数传递的参数为一个函数。也就是在index.js中,此方法可以省略。


发送和接收数据

有时,当客户端确认信息的接收时候能得到一个返回值。

为了做到这个,仅仅需要为send或者emit方法传递一个方法作为最后一个参数。当你使用emit时候,你同时传递数据:

服务端:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.on('ferret', function (name, fn) {
    fn('woot');
  });
});

客户端:

var socket = io(); // TIP: io() with no args does auto-discovery
  socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
    socket.emit('ferret', 'tobi', function (data) {
      console.log(data); // data will be 'woot'
    });
  });

说明:输出的结果为:‘woot’, 服务端的代码中的name为‘tobi’。


广播消息

仅仅在emit和send方法前增加broadcast的标志。广播意味着消息将会发给任何人除了消息的发起者:

服务端:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.broadcast.emit('user connected');
});

当做一个跨浏览器的websocket

如果你仅仅是需要实现websocket的基本功能即简单的发送消息,你可以这样做:

服务端:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.on('message', function () { });
  socket.on('disconnect', function () { });
});

客户端:

var socket = io('http://localhost/');
  socket.on('connect', function () {
    socket.send('hi');

    socket.on('message', function (msg) {
      // my msg
    });
  });

如果你不关注重连的逻辑等等,你可以看下 Engine.IO ,它是用socket.io实现websocket的基本功能。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值