前言
实在是不知道标题怎么拟定名字了,最近的项目需要用socket前端接收消息,知道Node无所不能,也听过socket.io的大名,于是开始测试如何使用它。
再吐槽一句最近成都好热,一直想学很多东西,感觉都因为天气的原因,还有给某游戏公司宣传的原因耽搁了。
D3.js和socket.js,还有angular.js
先记在这里,回头慢慢写攻略。
环境必备
node环境就不用说了
然后就是
npm install express --dev-save
npm install socket.io --dev-save
socket.io搭配express
这里仅仅是照着官网的API跑了一下demo
Sever.js
/*Using with Express 3.3.12*/
var app=require('express')();
var server=require('http').Server(app);
var io=require('socket.io')(server);
server.listen(80);
app.get('',function (req,rse) {
res.sendfile(__dirname+'/index.html');/* body... */
})
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.js'></script>
<script>
var socket=io('127.0.0.1');
socket.on('news',function(data) {
console.log(data);
socket.emit('my other event',{my:'data'});
})
</script>
说一下我的理解
作为一个对于后台语言了解不是很多的人,对于socket编程思想还是很难掌握。Java语言里面socket编程可以用一本书来形容。
服务器端
io.on('connection',function(socket) {
socket.emit('news',{hello:'world'});
socket.on('my other event',function(data) {
console.log(data);
})
})
首先io.sockets.on函数接受字符串”connection”作为客户端发起连接的事件,当连接成功后,调用带有socket参数的回调函数。
我们在使用socket.IO的时候,基本上都在这个回调函数里面处理用户的请求。
socket.emit(): 提交(发出)一个事件(事件名称用字符串表示),事件名称可以自定义,也有一些默认的事件名称,紧接着是一个对象,表示向该socket发送的内容;
socket.on():接收一个事件(事件名称用字符串表示),紧接着是收到事件调用的回调函数,其中data是收到的数据。
客户端
var socket=io('127.0.0.1');
socket.on('news',function(data) {
console.log(data);
socket.emit('my other event',{my:'data'});
})
有两点要注意的:socket.io.js路径要写对,这个js文件实际放在了服务器端的node_modules文件夹中,在请求这个文件时会重定向,因此不要诧异服务器端不存在这个文件但为什么还能正常工作。当然,你可以把服务器端的socket.io.js这个文件拷贝到本地,使它成为客户端的js文件,这样就不用每次都向Node服务器请求这个js文件,增强稳定性。
第二点是要用var socket = io.connect(‘网站地址或ip’);来获取socket对象,接着就可以使用socket来收发事件。
关于事件处理,上面的代码表示收到“news”事件后,打印收到的数据,并向服务器发送“other event”事件。
注:内置默认的事件名例如“disconnect”表示客户端连接断开,“message”表示收到消息等等。自定义的事件名称,尽量不要跟Socket.IO中内置的默认事件名重名,以免造成不必要的麻烦。
其他常用API
1).向所有客户端广播:socket.broadcast.emit(‘broadcast message’);
2).进入一个房间(非常好用!相当于一个命名空间,可以对一个特定的房间广播而不影响在其他房间或不在房间的客户端):socket.join(‘your room name’);
3).向一个房间广播消息(发送者收不到消息):socket.broadcast.to(‘your room name’).emit(‘broadcast room message’);
4).向一个房间广播消息(包括发送者都能收到消息)(这个API属于io.sockets):io.sockets.in(‘another room name’).emit(‘broadcast room message’);
5).强制使用WebSocket通信:(客户端)socket.send(‘hi’),(服务器)用socket.on(‘message’, function(data){})来接收。

1万+

被折叠的 条评论
为什么被折叠?



