Socket.io 快速搭建 和 注意事项

栏目: Html5 · 发布时间: 5年前

websocket 是一种比较简单的协议,各种语言中都有很多实现版本,实际上它们差别不大,都是在websocket的基础上做些封装,随便选一个即可。

socket.io 就是众多 websocket 库中的一种,它并不像其它库那样简单地实现了一下websocket,而是在websocket外面包裹了厚厚的一层。普通的 websocket (例如ws库)只需要服务端就够了, socket.io 自定义了一种基于 websocket 的协议,所以 socket.io 的服务端和客户端必须配套。简言之,如果服务端使用 socket.io ,那么客户端就没得选了,必然也用 socket.io 的客户端。

socket.io 的服务端是基于 node 实现的(只提供了这一种语言的服务端实现),同时它提供了多种语言的客户端,包括JavaScript、 Java 、C++、Swift、Dart等,可以看出,socket.io是为了移动端才支持多种语言的,socket.io的目标很高远:统一天下,做最好的websocket库。

当然phper来说也可以用workerman, php-cli 运行的效率和 node 差不多,只不过 php-cli做的io和进程 感觉没有node做的好,而已socket.io 传输的数据为 json ,json 在 JavaScript 里操作可以说极佳体验。

处于业务和成本考虑,没有选择市面吹牛吹上天的swoole来这个socket服务,有那个功夫你还不如直接用golang。Swoole也是有好处的,用来加速一下自己的yii2 laravel 程序还是不错的。 在性能还接受的情况下使用socket.io Socket 服务是挺不错的解决方案。

怎么安装那些自己去百度吧或者直接看这里 https://www.shuaihua.cc/article/socket-io-official-document-translate-part-one/

下面直接说重要的api

也就两个api

on()        和 jquery 一样用于绑定事件
emit()     用于绑定发送事件
httpServer (http.Server) 需要绑定的服务。

socket.io 几个重要的事件

connect         客户端的socket连接实例
connection    用法同Event: ‘connect’。
disconnect    关闭对客户端的链接,如果close的值为true,则关闭下行连接,否则,仅仅关闭命名空间。

在express里集成

var app = require('express')();     //创建express服务
var server = require('http').Server(app);   //绑定httpServer服务
var io = require('socket.io')(server);      //注入socket.io

server.listen(80);

app.get('/', function (req, res) {
    res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
    //链接时候触发
    // socket 客户端当前 sokcet 对像
    socket.emit('news', {hello: 'world'});
    socket.on('my other event', function (data) {
        console.log(data);
    });
});

客户端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

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

如何做向指定用户发送消息?

var app = require('express')();     //创建express服务
var server = require('http').Server(app);   //绑定httpServer服务
var io = require('socket.io')(server);      //注入socket.io

server.listen(80);

app.get('/', function (req, res) {
    res.sendfile(__dirname + '/index.html');
});


let SocketObj = {}; //先定义一个SocketObj集合

io.on('connection', function (socket) {
    //链接时候触发

    SocketObj[socket.id] = socket;  //链接存放

    // socket 客户端当前 sokcet 对像
    socket.emit('news', {hello: 'world'});
    socket.on('my other event', function (data) {
        console.log(data);
    });

    io.sockets.on('private message', function (data) {
        let to = data.from; //单独发送的SocketId 自己定义什么标记都好
        SocketObj[to].emit('notice email', {data: data.msg});
        //SokcetObj[to].emit('notice message', {data: data.msg});   看个人爱好
        //SokcetObj[to].emit('notice msg', {data: data.msg});       看个人爱好
    })

    socket.on('disconnect', function () {
        delete SocketObj[socket.id];
        socket.emit('notice disconnect'); //通知有人离开了
    })
});

注意什么时候用 io.on() 什么时候用 socket.on()

怎么做特定的聊天室

先在数据库创建特定话题 的聊天室
然后 使用 socket.join(room[, callback]) 
 
io.on('connection', (socket) => {
  socket.join('room 237', () => {
    let rooms = Objects.keys(socket.rooms);
    console.log(rooms); // [ <socket.id>, 'room 237' ]
    io.to('room 237', 'a new user has joined the room'); // broadcast to everyone in the room
  });
});

socket.leave(room[, callback])  从指定的房间里移除客户端,并且可选择的执行一个异常回调函数。

[socket.to](room)          为了能对多个房间触发同一个广播,你需要给多个房间链式的执行几次to方法。

以上所述就是小编给大家介绍的《Socket.io 快速搭建 和 注意事项》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Bandit Algorithms for Website Optimization

Bandit Algorithms for Website Optimization

John Myles White / O'Reilly Media / 2013-1-3 / USD 19.99

This book shows you how to run experiments on your website using A/B testing - and then takes you a huge step further by introducing you to bandit algorithms for website optimization. Author John Myle......一起来看看 《Bandit Algorithms for Website Optimization》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具