node模块之socket.io

1. 简介

Web领域的实时推送技术,让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室、在线客服系统、评论系统等.在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询 (Polling)和Comet技术

socket.io(插口)是一个WebSocket库,包括了客户端的js和服务器端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用。它会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化,而且支持的浏览器最低达IE5.5,可以满足绝大部分需求。

2.安装

进入目录,在node.js环境下键入:npm install socket.io

3.例子:结合express来构建服务器

express是一个Node.js的Web应用框架,在构建HTTP服务器时经常使用到,所以直接以Socket.IO和express为例子

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server);
server.listen(3000); 

基本使用方法:主要分为服务器端和客户端两段代码

Server(app.js):服务器端

//接上面的代码
app.get('/', function (req, res) {
    res.sendfile(__dirname + '/index.html');});
io.sockets.on('connection', function (socket) {
    socket.emit('news', { hello: 'world' });
    socket.on('other event', function (data) {
        console.log(data);
    });
});

首先io.sockets.on函数接受字符串connection作为客户端发起连接的事件,当连接成功后,调用带有socket参数的回调函数.使用socket.IO的时候,基本上都在这个回调函数里面处理用户的请求

 

扫描二维码关注公众号,回复: 291423 查看本文章

在上面的例子中,我们发送了news事件和收到了other event事件,那么客户端应该会有对应的接收和发送事件。而且客户端代码和服务器正好相反,且非常相似

 

socket最关键的是emit和on两个函数,

socket.emit:提交/发出一个事件(事件名称用字符串表示),事件名称可以自定义,也有一些默认的事件名称,紧接着是一个对象,表示向该socket发送的内容;

socket.on:接收一个事件(事件名称用字符串表示),紧接着是收到事件调用的回调函数,其中data是收到的数据

例如:station/index.js里
socket.emit(''+queueConfStation.sta_id, pkg);
//pkg是对象
gnss/server/config/messagequeue.js里
socket.on('' + socket.handshake.query.station, function (data) {
         //.........
}

Client(client.js):客户端

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

事件处理:上面的代码表示收到news事件后,打印收到的数据,并向服务器发送other event事件。

有两点要注意的:socket.io.js路径要写对,这个js文件实际放在了服务器端的node_modules文件夹中,在请求这个文件时会重定向,因此不要诧异服务器端不存在这个文件但为什么还能正常工作。当然,可以把服务器端的socket.io.js这个文件拷贝到本地,使它成为客户端的js文件,这样就不用每次都向Node服务器请求这个js文件,增强稳定性。第二点是要用var socket = io.connect(网站地址或ip);来获取socket对象,接着就可以使用socket来收发事件

 

注意:内置默认的事件名例如disconnect表示客户端连接断开,message表示收到消息等等。自定义的事件名称,尽量不要跟Socket.IO中内置的默认事件名重名,以免造成不必要的麻烦

扩展:

①为了建立一个WebSocket连接,客户端浏览器首先要向服务器发起一个HTTP请求,这个请求和通常的HTTP请求不同,包含了一些附加头信 息,其中附加头信息”Upgrade: WebSocket”表明这是一个申请协议升级的HTTP请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连 接。

②Socket.IO通过Node.js实现WebSocket服务端,同时也提供客户端JS库。Socket.IO支持以事件为基础的实时双向通讯,它可以工作在任何平台、浏览器或移动设备

③Socket.IO支持4种协议:WebSocket、htmlfile、xhr-polling、jsonp-polling,它会自动根据浏览器选择适合的通讯方式,从而让开发者可以聚焦到功能的实现而不是平台的兼容性,同时Socket.IO具有不错的稳定性和性能

猜你喜欢

转载自570109268.iteye.com/blog/2372914
今日推荐