分享
  1. 首页
  2. 文章

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

傻梦兽 · · 2034 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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 快速搭建 和 注意事项

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2034 次点击
1 回复 | 直到 2019年07月05日 10:55:52
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏