## 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);
```