前言网上查了socket.io官方文档,好像没找到最新的中文文档。有老的,比如这个(socket.io中文文档)2017年的。官网的例子和网上大部分介绍的例子差不多,就是一个群聊窗口,太简单了。这给很多有兴趣学习socket.io的人造成了不便。这里翻译了socket.io官网关于namespace和rooms的文档。希望对大家有所帮助。如果需要咨询的人多,再考虑翻译其他部分。原文地址:RoomsandNamespaces下面是翻译命名空间(namespace,以下简称ns)socket.io允许你为套接字定义不同的命名空间。本质上就是指定不同的端点或路径。这是一个有用的方法,它可以减少所需资源的数量(tcp连接数),同时通过隔离通信通道(channel通道)来实现应用程序多个部分的隔离。默认命名空间我们使用默认命名空间/,它既是socket.io客户端的默认连接,也是服务端默认监听的命名空间。ns通过io.sockets或简单的io调用来区分://以下两个将发射到所有连接到`/`的套接字io.sockets.emit('hi','everyone');io.emit('嗨','大家');//shortform每个ns都会触发一个连接事件,并将socket作为参数传递给事件响应io.on('connection',function(socket){socket.on('disconnect',function(){});});如果要设置自定义的ns,可以在服务端调用of函数:constnsp=io.of('/my-namespace');nsp.on('connection',function(socket){console.log('someoneconnected');});nsp.emit('hi','everyone!');在客户端,可以告诉socket.io客户端连接到对应的nsconstsocket=io('/my-namespace');重要提示:ns只是socket.io协议的实现细节,与实际URL所代表的底层传输无关,如:/socket.io/...rooms(房间)在每个ns中,你可以为这些套接字定义专用通道可以加入和离开加入和离开你可以让套接字通过调用连接函数订阅指定的通道io.on('connection',function(socket){socket.join('someroom');});然后,在广播或分发时,您可以简单地使用to或in(两者等效)io.to('someroom').emit('someevent');如果想离开频道,可以像调用join一样调用leave。这两个方法是异步的,并且接受回调函数参数。默认房间在socket.io中,每个socket将通过一个随机的、不可测量的唯一标识符socket#id来区分。为了方便起见,每个插座都会通过这个标识id自动添加到一个房间。这对于向其他套接字广播消息很方便:io.on('connection',function(socket){socket.on('saytosomeone',function(id,msg){socket.broadcast.to(id)。emit('我的消息',msg);});});断开连接(disconnection)对应的是断开连接,socket还是自动离开所有的channel,不需要你做其他的处理从外面发送消息有时候,你可能需要在你的socket.ions/rooms外面的sockets上派发事件socket.io进程的上下文有一些方法可以处理这个,比如实现自己的通道来向进程发送消息为了简化这种情况,我们创建了两个模块socket.io-redissocket.io-emitter实现了redis适配器:constio=require('socket.io')(3000);constredis=require('socket.io-redis');io.adapter(redis({host:'localhost',port:6379}));然后你可以从其他进程向任何通道发送消息constio=require('socket.io-emitter')({host:'127.0.0.1',port:6379});setInterval(function(){io.emit('time',newDate);},5000);以上为译文全文后记。好在这一段不长,内容也不多,翻译大概需要一个小时。对于文末的“从进程外发送消息”,这个例子和描述不是很清楚,这里补充一下:socket.io-redis和socket.io-emitter是两个独立的模块,它们不必组合使用。对于实际的生产环境,我们的socket.io服务可能部署在一个集群中,使用多个进程,或者在多个服务器上,那么某个进程的emit如何才能被其他进程的client接收到呢?这时候socket.io-redis就是一个有效的工具。它利用redis本身的Pub/Sub机制来达到向其他进程上的客户端广播消息的目的。socket.io-emmitter完全依赖于从其他非socket.io进程向socket.io进程发送消息,它与socket.io-redis结合使用。
