socket.io
Socket.IO是一个WebSocket库,包括了客户端的js和服务器端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用。
2. socket.io的特点 [#](#t12. socket.io的特点)
- 易用性:socket.io封装了服务端和客户端,使用起来非常简单方便。
- 跨平台:socket.io支持跨平台,这就意味着你有了更多的选择,可以在自己喜欢的平台下开发实时应用。
- 自适应:它会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化,而且支持的浏览器最低达IE5.5。
3. 初步使用 [#](#t23. 初步使用)
3.1 安装部署 [#](#t33.1 安装部署)
使用npm安装socket.io
$ npm install socket.io
3.2 启动服务 [#](#t43.2 启动服务)
创建 app.js
文件
var express = require('express');
var path = require('path');
var app = express();
app.get('/', function (req, res) {
res.sendFile(path.resolve('index.html'));
});
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.on('connection', function (socket) {
console.log('客户端已经连接');
socket.on('message', function (msg) {
console.log(msg);
socket.send('sever:' + msg);
});
});
server.listen(80);
3.3 客户端引用 [#](#t53.3 客户端引用)
服务端运行后会在根目录动态生成socket.io的客户端js文件 客户端可以通过固定路径/socket.io/socket.io.js
添加引用
客户端加载socket.io文件后会得到一个全局的对象io
connect
函数可以接受一个url
参数,url可以socket服务的http完整地址,也可以是相对路径,如果省略则表示默认连接当前路径 创建index.html文件
<script src="/socket.io/socket.io.js"></script>
window.onload = function(){
var socket = io.connect('/');
//监听与服务器端的连接成功事件
socket.on('connect',function(){
console.log('连接成功');
});
//监听与服务器端断开连接事件
socket.on('disconnect',function(){
console.log('断开连接');
});
};
3.4 发送消息 [#](#t63.4 发送消息)
成功建立连接后,我们可以通过socket
对象的send
函数来互相发送消息 修改index.html
var socket = io.connect('/');
socket.on('connect',function(){
//客户端连接成功后发送消息'welcome'
socket.send('welcome');
});
//客户端收到服务器发过来的消息后触发
socket.on('message',function(message){
console.log(message);
});
修改app.js
var io = require('scoket.io');
io.on('connection',function(socket){
//向客户端发送消息
socket.send('欢迎光临');
//接收到客户端发过来的消息时触发
socket.on('message',function(data){
console.log(data);
});
});
4. 深入分析 [#](#t74. 深入分析)
4.1 send方法 [#](#t84.1 send方法)
send
函数只是emit
的封装
function send(){
var args = toArray(arguments);
args.unshift('message');
this.emit.apply(this, args);
return this;
}
emit
函数有两个参数
- 第一个参数是自定义的事件名称,发送方发送什么类型的事件名称,接收方就可以通过对应的事件名称来监听接收
- 第二个参数是要发送的数据
4.2 服务端事件 [#](#t94.2 服务端事件)
事件名称 | 含义 |
---|---|
connection | 客户端成功连接到服务器 |
message | 接收到客户端发送的消息 |
disconnect | 客户端断开连接 |
error | 监听错误 |
4.3 客户端事件 [#](#t104.3 客户端事件)
事件名称 | 含义 |
---|---|
connec | 成功连接到服务器 |
message | 接收到服务器发送的消息 |
disconnect | 客户端断开连接 |
error | 监听错误 |
5. 划分命名空间 [#](#t115. 划分命名空间)
5.1 服务器端划分命名空间 [#](#t125.1 服务器端划分命名空间)
io.on('connection', socket => {}
io.of('/news').on('connection', socket => {}
5.2 客户端连接命名空间 [#](#t135.2 客户端连接命名空间)
let socket = io('http://localhost/');
let socket = io('http://localhost/news');
6. 房间 [#](#t146. 房间)
房间是Socket.IO提供的一个非常好用的功能。房间相当于为指定的一些客户端提供了一个命名空间,所有在房间里的广播和通信都不会影响到房间以外的客户端。
6.1 进入房间 [#](#t156.1 进入房间)
socket.join('chat');//进入chat房间
6.2 离开房间 [#](#t166.2 离开房间)
socket.leave('chat');//离开chat房间
7. 广播 [#](#t177. 广播)
全局广播就是所有连接到服务器的客户端都会受到广播的信息
7.1 向所有人广播 [#](#t187.1 向所有人广播)
io.emit('message','全局广播');
7.2 向除了自己外的所有人广播 [#](#t197.2 向除了自己外的所有人广播)
socket.broadcast.emit('message', 'default server: ' + msg);
socket.broadcast.emit('message', 'news server: ' + msg);
7.3 向包括自己外的所有人广播 [#](#t207.3 向包括自己外的所有人广播)
io.sockets.emit('message', 'default server: ' + msg);
io.of('/news').emit('message', 'news server: ' + msg);
7.4 向房间内广播 [#](#t217.4 向房间内广播)
从客户端的角度来提交事件,提交者会排除在此
//2. 向myRoom广播一个事件,在此房间内除了自己外的所有客户端都会收到消息
socket.broadcast.to('myroom').emit('message', 'default server: ' + msg);
socket.broadcast.to('myroom').emit('message', 'news server: ' + msg);
7.5 向房间内广播 [#](#t227.5 向房间内广播)
从服务器的角度来提交事件,提交者会包含在内
//2. 向myRoom广播一个事件,在此房间内除了自己外的所有客户端都会收到消息
io.in('myRoom').emit('message', 'default server: ' + msg);
io.of('/news').in('myRoom').emit('message', 'news server: ' + msg);
7.4 其它API [#](#t237.4 其它API)
io.sockets.manager.rooms
获取所有房间的信息 //key为房间名,value为房间名对应的socket ID数组io.sockets.clients('particular room')
//获取particular room中的客户端,返回所有在此房间的socket实例
5.3 聊天室 [#](#t245.3 聊天室)
app.js
var express = require('express');
var path = require('path');
var app = express();
app.get('/', function (req, res) {
res.sendFile(path.resolve('index.html'));
});
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.on('connection', function (socket) {
var inRoom;
socket.on('message', function (msg) {
if(inRoom){
io.in(inRoom).emit('message',msg);
}else{
io.emit('message',msg);
}
});
socket.on('join', function (room) {
socket.join(room);
io.emit('message','加入'+room);
inRoom = room;
});
});
server.listen(80);
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>聊天室</title>
<link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<button class="btn btn-primary" onclick="join('chat')">进入聊天房间</button>
<button class="btn btn-primary" onclick="join('study')">进入学习房间</button>
<span id="room"></span>
</div>
<div class="panel-body">
<ul class="list-group" id="messages">
</ul>
</div>
<div class="panel-footer">
<input type="text" class="form-control" id="msg"/>
<button type="button" onclick="send()" class="btn btn-primary">发言</button>
</div>
</div>
</div>
</body>
<script src="/socket.io/socket.io.js"></script>
<script>
window.onload = function(){
var socket = io.connect('/');
socket.on('message',function(msg){
var messages = document.querySelector('#messages');
var li = document.createElement('li');
li.innerHTML = msg;
li.className = 'list-group-item';
messages.appendChild(li);
});
window.send = function(){
var input = document.querySelector('#msg');
socket.send(input.value);
input.value = '';
}
window.join = function(room){
socket.emit('join',room);
document.querySelector('#room').innerHTML = room;
}
};
</script>
</html>
Gitalking ...
Be the first guy leaving a comment!