Express中的socket.io

socket.io中文api博客地址:https://blog.csdn.net/u010528747/article/details/54341751

一、socketio开发时的使用范围

wifi的IP动态分配机制,socket属于可靠连接,在wifi中,其他设备(pc,手机)访问都没法通过ip访问,虽然能访问http协议的服务,但socket不行

二、Express中的使用

express中的代码:
先下载 npm i socket.io
socket.on 是接收数据
io.emit 是发送数据
server.listen() 一定要新开一个端口,它代表socket.io的通信端口
socket.emit 发送的数据应该为字符串格式,所以每次用JSON.stringfy()来格式化一下,再在socket.on时JSON.parse()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const app = require("express")();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
// 连接客户端
io.on('connection', socket => {
// 接收message事件的数据
socket.on('message', data => {
console.log("服务器收到消息" + data);
// io.emit代表广播,socket.emit代表私发
io.emit('message', data);
})

// 客户端断开,自带事件
socket.on('disconnect', function () {
io.emit('leave', socket.nickname + ' left')
})
});
server.listen(8000) //一定要新开一个端

三、前端代码

下载 npm i socket.io-client

1
2
3
4
5
6
import io from "socket.io-client";
const socket = io("ws://localhost:8000"); //和后端接收和发送socket.io数据的端口

socket.on("message", data => console.log(data))
socket.emit("message","aaaa");
console.log("向服务器发送消息")

四、socket.io私发消息

socket.id是对客户端的唯一值,和session.id差不多一个意思,每次客户端连接socket.id都会变。

关键语法:

socket.to(session.id).emit(‘message’, data) 私发给指定session.id的客户端消息
socket.emit(‘message’, data) 给socket客户端发消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module.exports = app => {
const server = require('http').createServer(app);
const io = require('socket.io')(server);
let usersObj = {}; //存放登录的用户的socket.id
io.on('connection', socket => {
// 接收发的消息
socket.on('message', data => {
// 把发送方的id值当做key值,socket.id当value值存放在usersObj,每次刷新页面socket.id都会
let msgData = JSON.parse(data);
usersObj[msgData.from] = socket.id;

console.log("服务器收到消息" + data);
// 将消息私发给指定的客户端
socket.to(usersObj[msgData.to]).emit('message', data);
// 给socket客户端发消息
socket.emit('message', data);
})
});
server.listen(8000)
}