ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## API记忆 `broadcast`是`socket`下的方法而不是`io`下的,因为broadcast是向除了自己以外的所有人广播,而socket就表示(自己)用户当前的连接。 > broadcast.to(`<room>`).emit(event,data); >io.of(namespace).in(`<room>`).emit(event,data) io比broadcast强的一点在于它能在一个namespace下向另一个namespace发送消息(虽然包括自己) 服务器可以这样划分namespcae ``` io.on('connection', socket => {} io.of('/news').on('connection', socket => {} ``` 对应客户端 ``` let socket = io('http://localhost/'); let socket = io('http://localhost/news'); ``` ## 安装 ``` npm i socket.io npm i socket.io-client ``` ## 和express配合 ``` const server = require('http').Server(app); //用原生http包裹express app const io = require('socket.io')(server); //再用socket包裹 ``` 这样的话express中注册的其它路由仍然能照常访问并且还能连接上socket 我们可以绑定给io绑定`connection`事件 ``` io.on('connection', function (socket) { //socket当前用户的连接 console.log('user login'); socket.on('sendmsg',function(data){ //监听客户端的emit ... }); // console.log(data); io.emit('recvmsg',data); //recvmsg 自定义的一个事件 向客户端广播 需在客户端监听 }) }); ``` 其中`sendmsg`和`recvmsg`都是用户自定义的事件 ## 客户端的使用 ``` import io from 'socket.io-client'; const socket = io('ws://localhost:9093'); //跨域的话需要手动指定 ``` ### emit 和服务端一样都有emit方法 ``` export function sendMsg({from,to,msg}){ return dispatch=>{ socket.emit('sendmsg', {from, to, msg}); } } ``` #### send send是对emit的封装 等于 ``` socket.emit('message',...); ``` ### on 和服务端一样都有on方法 ``` socket.on('recvmsg', (data) => { //recvmsg 由服务端自定义的一个事件 console.log(data) this.setState({ msg: [...this.state.msg, data.text] }) }); ``` ## connect和connection connect是客户端绑定的事件,connection是服务端绑定的事件 ## 关于客户端引用路径 服务端运行后会在根目录动态生成socket.io的客户端js文件 客户端可以通过固定路径`/socket.io/socket.io.js`添加引用 客户端加载socket.io文件后会得到一个全局的对象io connect函数可以接受一个url参数,url可以socket服务的http完整地址,也可以是相对路径,如果省略则表示默认连接当前路径 创建index.html文件 ## 事件汇总 事件名称 含义 connection 客户端成功连接到服务器 message 接收到客户端发送的消息 disconnect 客户端断开连接 error 监听错误 ## 划分命名空间 ### 服务器端划分命名空间 ``` io.on('connection', socket => {} io.of('/news').on('connection', socket => {} ``` ### 客户端连接命名空间 ``` let socket = io('http://localhost/'); let socket = io('http://localhost/news'); ``` ## 房间 ### 进入房间 ``` socket.join('chat');//进入chat房间 ``` ### 离开房间 ``` socket.leave('chat');//离开chat房间 ``` ## 广播 ### 向所有人广播 ``` io.emit('message','全局广播'); ``` ### 向除了自己外的所有人广播 ``` socket.broadcast.emit('message', 'default server: ' + msg); socket.broadcast.emit('message', 'news server: ' + msg); ``` ### 向包括自己的所有人广播 ``` io.sockets.emit('message', 'default server: ' + msg); io.of('/news').emit('message', 'news server: ' + msg); ```