了解Socket.io
在现代网络开发环境中,Websockets正变得非常普遍。现在大多数网络开发者都想开发实时的网络应用,或者将他们现有的应用定制为实时的,以便适当地满足用户的需求。这就是websockets发挥的主要作用。
什么是websocket?
Websocket是一种计算机通信协议,它使客户端和服务器之间通过单一的TCP连接进行全双工通信。位于OSI模型第7层的Websocket协议使网络浏览器或其他客户端应用程序与网络服务器之间的互动,其开销低于http轮询等半双工替代方案,从而促进两者之间的实时数据传输。
什么是socket.io?
Socket.io是一个JavaScript库,能够在客户端和服务器之间进行实时、双向和事件驱动的通信。Socket.io由两个类似的API组成,即
- 一个node.js服务器API。
- 一个JavaScript客户端API,它也可以从node.js运行。
Socket.io在引擎盖下使用engine.io来建立连接,并在客户端和服务器之间交换数据。Engine.io用于服务器端的实现,而engine.io-client则用于客户端的实现。
Socket.io发布
Socket.io 1.0版本是它的主要发布版本,于2014年5月28日发布。该项目在1.0版本之前包含两个部分,即传输处理实现和高级API。随着主要版本的发布,传输处理已被转移到Engine.io,它允许开发人员为实时网络建立新的实时API,而无需重新发明。除此之外,socket.io还引入了以下变化。
- 二进制流支持。
- 改进的水平缩放支持。
- Socket.io-streams模块,支持node.js流。
在服务器端设置socket.io
在node.js服务器上设置socket.io就像向http.server实例添加事件监听器一样简单。让我们看看一个代码例子
const server = require('net').createServer()
const io = require('socket.io')(server)
io.on('connection', (socket) => {
// new client connection
socket.emit('connect', {message: 'a new client connected'})
})
server.listen(2400)
Socket.io也可以附加到其他HTTP框架上。下面的代码片段显示了如何将socket.io附加到Express.js框架。
const express = require('express')
const server = require('http').Server(app)
const io = require('socket.io')(server)
io.on('connection', (socket) => {
// new client connection
socket.emit('connect', {message: 'a new client connected'})
})
server.listen(2400)
下面的代码片段显示了如何将socket.io附加到hapi框架中。
const server = require('hapi').createServer(2400);
const io = require('socket.io')(server.listener);
io.on('connection', (socket) => {
// new client connection
socket.emit('connect', {message: 'a new client connected'})
});
server.start();
在客户端设置socket.io
为了让socket.io客户端连接到socket.io服务器,socket.io.js脚本需要被添加到客户端html页面的body标签中。下面是一个代码例子
<script src="/socket.io/socket.io.js"></script>
下面的代码片断建立了一个与服务器的连接。它使用本地主机作为例子。
<script>
var socket = io.connect("http://localhost:2400");
</script>
Socket.io 客户端-服务器通信
Socket.io是基于事件的,意味着客户端和服务器通过事件进行通信。客户端和服务器都可以发射和监听事件,每个事件包含一个主体,在大多数情况下是一个JSON对象。下面是一个由node.js服务器发出并由客户端监听的推特事件的例子。
io.on("connection", (socket) => {
const tweet = {source: 'Peter', text: "Hello, world!"};
socket.emit('tweer', tweet)
})
这就是客户端的浏览器对事件的监听方式
socket.on("tweet", (tweet) => {
console.log("tweet from", tweet.source);
console.log("content:", tweet.text);
});
我们可以向服务器发送任何JSON对象,也可以从服务器发送。这包括字符串、数字、数组和布尔运算。从Socket.io 1.0开始,我们还可以发送Node.js Buffer对象。
总结
Socket.IO在Node.js的普及过程中发挥了重要作用,它使WebSockets既方便又可靠。1.0版本代表了其发展的重要一步,而Engine.IO的提取则为Node.js生态系统带来了一些有趣的可能性。