在web开发中常常会遇到前后端通信的情况出现,甚至是双向通信,类似于聊天室的功能,那么今天的主角就是Socket.IO
什么是Socket.IO?
官网:https://socket.io/
github地址:https://github.com/socketio/socket.io
其他语言的客户端实现,由社区维护
Socket.IO 是一个面向实时 web 应用的 JavaScript 库。它使得服务器和客户端之间实时双向的通信成为可能。他有两个部分:在浏览器中运行的客户端库,和一个面向Node.js的服务端库。两者有着几乎一样的API。像Node.js一样,它也是事件驱动的,Socket.IO 主要使用WebSocket协议,尽管它可以被用作WebSocket的包装库,它还是提供了许多其它功能,比如广播至多个套接字,存储与不同客户有关的数据,和异步IO操作。
优势
Socket.IO 会自动选择合适双向通信协议,仅仅需要程序员对套接字的概念有所了解。
劣势
Socket.io并不是一个基本的、独立的、能够回退到其它实时协议的WebSocket库,它实际上是一个依赖于其它实时传输协议的自定义实时传输协议的实现。该协议的协商部分使得支持标准WebSocket的客户端不能直接连接到Socket.io服务器,并且支持Socket.io的客户端也不能与非Socket.io框架的WebSocket或Comet服务器通信。因而,Socket.io要求客户端与服务器端均须使用该框架。
使用示例
服务端:
socketio服务端示例
客户端:
socketio客户端示例
运行客户端和服务端之后会得到如下结果
客户端会打印接受到的消息hello对象
客户端结果
服务端也会接收到客户端发送的消息
服务端结果
发送和接收事件
Socket.IO允许您发出和接收除connect,message和disconnect之外的自定义事件
// note, io(<port>) will create a http server for you
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.emit('user disconnected');
});
});
广播消息
要广播,只需添加一个broadcast标志emit和send方法调用。广播意味着向除了启动它的套接字之外的所有人发送消息。
服务端
var io = require('socket.io')(80);
io.on('connection', function (socket) {
socket.broadcast.emit('user connected');
});
像使用WebSocket一样来使用它
只需利用send并倾听message事件
服务端
var io = require('socket.io')(80);
io.on('connection', function (socket) {
socket.on('message', function () { });
socket.on('disconnect', function () { });
});
客户端
<script>
var socket = io('http://localhost/');
socket.on('connect', function () {
socket.send('hi');
socket.on('message', function (msg) {
// my msg
});
});
</script>
总结
Socket.IO设计的目标是构建各端的实时应用,如实时分析系统、二进制流数据处理应用、在线聊天室、在线客服系统、评论系统、WebIM等。目前已经兼容主流的浏览器,它实现了实时、双向、基于事件的通讯机制,它解决了实时的通信问题,并统一了服务端与客户端的编程方式。启动了Socket以后,就像建立了一条客户端与服务端的管道,两边可以互通有无。它还能够和Express.js提供的传统请求方式很好的结合,即可以在同一个域名,同一个端口提供两种连接方式。因此在Web开发中可以使用它来完成很多实时的复杂操作,打造更加优雅的用户体验。