var socket = io.connect('https://www.jb51.net/'); socket.on('connect',function(){ //客户端连接成功后发送消息'hello world!' socket.send('hello world!'); }); socket.on('message',function(data){ alert(data); });
连接成功后,我们向服务端发送消息hello world!,还为socket注册了message事件,它是send函数对应的接收消息的事件,当服务端向客户端send消息时,我们就可以在message事件中接收到发送过来的消息。
服务端向客户端发送消息也可以通过send的方式,示例 - 服务端向客户端发送消息(app.js):
var io = require('scoket.io'); io.on('connection', function (socket) { socket.send('Hello World!'); socket.on('message', function (data) { console.log(data); }) });
与客户端相同,服务端也需要为socket注册message事件来接收客户端发送过来的消息。
WebSocket 发送信息socket.io既然是用来实现通讯的,那么如何发送、接收信息才是根本。
在socket.io中,emit函数用于发送数据,我们使用send的方式实现了信息的互发,其实send函数只是emit的封装,实际上还是使用了emit,且看send函数是如何实现的:
function send(){ var args = toArray(arguments); args.unshift('message'); this.emit.apply(this, args); return this; }
在send函数中,获取到原来的参数,并在原来的基础上插入了一个参数message,然后调用了emit函数。通过send函数的实现,我们也学会了emit函数的用法,它有多个参数,第一个参数是事件名称,在接收端注册该事件就可以接收到发送过去的信息,事件名称可以自由定义,在不同的场景下,我们可以定义不同的事件来接收消息。第二个参数才是发送的数据。了解清楚了工作原理,下面来将send替换成emit函数发送信息:
//app.js io.on('connection',function(socket){ socket.emit('message','连接成功!'); socket.on('message',function(data){ }); });
WebSocket 服务端事件事件监听是实现通讯的基础,因此充分了解socket.io的事件,学习如何在正确的时候使用它们至关重要。在一些关键的的状态下,socket.io可以注册相应的事件,通过事件监听,我们可以在这些事件中作出反应,常用的事件如下:
connection——客户端成功连接到服务器。
message——捕获客户端send信息。。
disconnect——客户端断开连接。
error——发生错误。
WebSocket 客户端较服务端而言,客户端提供更多的监听事件,在实时应用中,我们可以为这些事件注册监听并作出反应,例如:connect提示用户连接成功,disconnect时提示用户停止服务等等。
connection——成功连接到服务器。
connecting——正在连接。
disconnect——断开连接。
connect_failed——连接失败。
error——连接错误。
message——监听服务端send的信息。
reconnect_failed——重新连接失败。
reconnect——重新连接成功。
reconnecting——正在重连。
那么客户端socket发起连接时的顺序是怎么样的呢?当第一次连接时,事件触发顺序为: connecting → connect;
当失去连接时,事件触发顺序为:disconnect → reconnecting → connecting → reconnect → connect。
WebSocket 命名空间命名空间着实是一个非常实用好用的功能。我们可以通过命名空间,划分出不同的房间,在房间里的广播和通信都不会影响到房间以外的客户端。
那么如何创建房间呢?在服务端,通过of("")的方式来划分新的命名空间:
io.of('chat').on('connection',function(socket){ });
示例中,我们创建一个名为chat的房间,客户端可以通过如下方式连接到指定的房间:
var socket = io.connect('/chat');
虽然连接到指定的房间,但是我们也可以在服务端操作,自由的进出房间:
socket.join('chat');//进入chat房间 socket.leave('chat');//离开chat房间
WebSocket 广播消息在实时应用中,广播是一个不可或缺的功能,socket.io提供两种服务端广播方式。
第一种广播方式可以称之为'全局广播',顾名思义,全局广播就是所有连接到服务器的客户端都会受到广播的信息:
socket.broadcast.emit('DATA',data);
但是,在实际应用场景中,我们很多时候并不需要所有用户都收到广播信息,有的广播信息只发送给一部分客户端,比如某个房间里面的用户,那么可以使用如下方式:
socket.broadcast.to('chat').emit('DATA',data);
中间件socket.io提供中间件功能,我们可以通过中间件来对请求进行预处理,比如身份验证:
io.use(function(socket, next){ if (socket.request.headers.cookie) return next(); next(new Error('Authentication error')); });
示例中展示了通过中间件进行身份验证,当没有cookie的时候抛出异常。
传递参数