前言
初学node.js 想做个聊天室 在互联网上漫游阅读了很多文章,也依样画葫芦开始搭建自己的聊天室。
这个聊天室是基于express框架和socket.io通信库搭建的。
这也是在socket.io官网的例子的基础上进行的修改的。
什么是socket.io
socket.io就是对Websocket的封装,并且实现了Websocket的服务端代码,在WebSocket没有出现之前,实现与服务端的实时通讯可以通过轮询来完成任务.。Socket.io将Websocket和轮询(Polling)机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码。也就是说,Websocket仅仅是Socket.io实现实时通信的一个子集。
那么,Socket.io都实现了Polling中的那些通信机制呢?
- Adobe® Flash® Socket
- AJAX long polling
- AJAX multipart streaming
- Forever Iframe
- JSONP Polling
Adobe® Flash® Socket 大部分PC浏览器都支持的socket模式,不过是通过第三方嵌入到浏览器,不在W3C规范内,所以可能将逐步被淘汰,况且,大部分的手机浏览器都不支持这种模式。
AJAX long polling 这个很好理解,所有浏览器都支持这种方式,就是定时的向服务器发送请求,缺点是会给服务器带来压力并且出现信息更新不及时的现象。
AJAX multipart streaming 这是在XMLHttpRequest对象上使用某些浏览器(比如说Firefox)支持的multi-part标志。Ajax请求被发送给服务器端并保持打开状态(挂起状态),每次需要向客户端发送信息,就寻找一个挂起的的http请求响应给客户端,并且所有的响应都会通过统一连接来写入。
Forever Iframe (永存的Iframe)技术涉及了一个置于页面中的隐藏Iframe标签,该标签的src属性指向返回服务器端事件的servlet路径。每次在事件到达时,servlet写入并刷新一个新的script标签,该标签内部带有JavaScript代码,iframe的内容被附加上这一script标签,标签中的内容就会得到执行。这种方式的缺点是接和数据都是由浏览器通过HTML标签来处理的,因此你没有办法知道连接何时在哪一端已被断开了,并且Iframe标签在浏览器中将被逐步取消使用。
JSONP Polling JSONP轮询基本上与HTTP轮询一样,不同之处则是JSONP可以发出跨域请求,详细请搜索查询jsonp的内容。
socket.io中emit和on的用法
socket.emit(‘action’);表示发送了一个action命令,命令是字符串的,在另一端接收时,可以这么写: socket.on(‘action’,function(){…});
socket.emit(‘action’,data);表示发送了一个action命令,还有data数据,在另一端接收时,可以这么写: socket.on(‘action’,function(data){…});
socket.emit(action,arg1,arg2); 表示发送了一个action命令,还有两个数据,在另一端接收时,可以这么写: socket.on(‘action’,function(arg1,arg2){…});
在emit方法中包含回调函数,例如:
socket.emit(‘action’,data, function(arg1,arg2){…} );那么这里面有一个回调函数可以在另一端调用,另一端可以这么写:socket.on(‘action’,function(data,fn){ fn(‘a’,’b’) ; });
上面的data数据可以有0个或者多个,相应的在另一端改变function中参数的个数即可,function中的参数个数和顺序应该和发送时一致
上面的fn表示另一个端传递过来的参数,是个函数,写fn(‘a’,’b’) ;会回调函数执行。一次发送不应该写多个回调,否则只有最后一个起效,回调应作为最后一个参数。
socket.io系统api
- 服务端
io.on(‘connection’,function(socket));
监听客户端连接,回调函数会传递本次连接的socket
io.sockets.emit(‘String’,data);
给所有客户端广播消息
io.sockets.socket(socketid).emit(‘String’, data);
给指定的客户端发送消息
socket.on(‘String’,function(data));
监听客户端发送的信息
socket.emit(‘String’, data);
给该socket的客户端发送消息
- 客户端
建立一个socket连接
var socket = io(“http://localhost“); //监听本地任何端口的请求
客户端socket.on()监听的事件:
connect:连接成功
connecting:正在连接
disconnect:断开连接
connect_failed:连接失败
error:错误发生,并且无法被其他事件类型所处理
message:同服务器端message事件
anything:同服务器端anything事件
reconnect_failed:重连失败
reconnect:成功重连
reconnecting:正在重连
当第一次连接时,事件触发顺序为:connecting->connect;当失去连接时,事件触发顺序为:disconnect->reconnecting(可能进行多次)->connecting->reconnect->connect。
环境搭建
安装node.js就不用说了吧,自动集成npm包。
然后再安装 socket.io和express 在文件目录下运行node index
就能看到效果
客户端文件
|
|
客户端文件分为3个 一个页面html ,一个css文件 ,一个聊天脚本文件
基本思路就是构造一个客户对象 通过init函数实例化。通过socket来达到信息的交互。
服务端文件
|
|
服务端监听客户端的请求,同时向所有客户端发送消息
后记
至此,一个基于socket.io的聊天室便完成了。
这里分享一个拥有更强大功能的聊天室 更强大的聊天室
这篇文章写的很细,很适合新手学习。