vue3实现WebRTC 1v1通话 - 后端代码 (NestJS)
1. 安装依赖
```
npm install @nestjs/rtcsimplews --save
ts ts-node src/main.ts
```
2. 创建WebSocket控制器
在src目录下创建websocket文件夹,并在其中创建app.controller.ts文件。代码如下:
```
class AppController extends Controller {
constructor() {
super();
}
@Get('/call')
async call(@Param("from") from: string, @Param("to") to: string) {
const user1 = this.userService.findUserByName(from); // 查询用户信息
const user2 = this.userService.findUserByName(to);
// 创建WebSocket连接
const ws = new WebSocket.Server({ server: this.app.server });
ws.on('connection', (socket) => {
console.log("WebSocket connected.");
// 监听接收到的消息
socket.on('message', async (data) => {
const message = JSON.parse(data); // 解析消息内容
// 发送消息给另一个用户
await this.sendMessage(user1, user2, message);
});
});
}
async sendMessage(fromUser: User, toUser: User, message: string) {
const fromId = fromUser.id; // 获取发起者的ID
const toId = toUser.id; // 获取接收者的ID
// 发送消息给接收者
await this.messageService.sendMessage({ senderId: fromId, receiverId: toId, message });
}
}
```
3. 创建WebSocket服务类
在src目录下创建websocket文件夹,并在其中创建app.service.ts文件。代码如下:
```
class AppService {
constructor() {}
@InjectModel(User)
private readonly userService: User;
@InjectModel(Message)
private readonly messageService: Message;
}
```
4. 修改User和Message模型
在src目录下创建user文件夹,并在其中创建user.model.ts文件。代码如下:
```
class User extends Model implements BaseEntity {
constructor(obj?: any, config?: ConfigType) {
super(obj, config); // 调用父类构造函数
}
@Column()
name: string;
@Column({ type: "string", length: 20 })
password: string;
@Column({ default: true })
isActive: boolean = false;
static async findUserByName(name: string) {
const user = await this.findOne({ where: { name } }); // 根据用户名查找用户信息
return user;
}
}
```
在src目录下创建message文件夹,并在其中创建message.model.ts文件。代码如下:
```
class Message extends Model implements BaseEntity {
constructor(obj?: any, config?: ConfigType) {
super(obj, config); // 调用父类构造函数
}
@Column()
senderId: number;
@Column()
receiverId: number;
@Column({ type: "string" })
message: string;
static async sendMessage(messageData) {
const message = await this.create(messageData); // 创建消息记录
return message;
}
}
```
5. 修改main.ts文件
在src目录下创建main.ts文件。代码如下:
```
class AppModule extends Module {
constructor() {
super();
}
configure(consumer: Consumer) {
consumer.apply(
new ModuleReflectiveInterceptor(
this.selectorFactory, // 选择器工厂
this.metadataFactory, // 元数据工厂
this.metadataStore // 元数据存储
)
);
}
selectorFactory() {
return new Selector();
}
metadataFactory() {
return new Metadata();
}
metadataStore = {};
}
```
6. 启动项目并测试
运行以下命令启动项目:
```
ts src/main.ts
```
使用浏览器访问http://localhost:3000/call,输入两个用户的名称,即可进行1对1视频通话。
```
npm install @nestjs/rtcsimplews --save
ts ts-node src/main.ts
```
2. 创建WebSocket控制器
在src目录下创建websocket文件夹,并在其中创建app.controller.ts文件。代码如下:
```
class AppController extends Controller {
constructor() {
super();
}
@Get('/call')
async call(@Param("from") from: string, @Param("to") to: string) {
const user1 = this.userService.findUserByName(from); // 查询用户信息
const user2 = this.userService.findUserByName(to);
// 创建WebSocket连接
const ws = new WebSocket.Server({ server: this.app.server });
ws.on('connection', (socket) => {
console.log("WebSocket connected.");
// 监听接收到的消息
socket.on('message', async (data) => {
const message = JSON.parse(data); // 解析消息内容
// 发送消息给另一个用户
await this.sendMessage(user1, user2, message);
});
});
}
async sendMessage(fromUser: User, toUser: User, message: string) {
const fromId = fromUser.id; // 获取发起者的ID
const toId = toUser.id; // 获取接收者的ID
// 发送消息给接收者
await this.messageService.sendMessage({ senderId: fromId, receiverId: toId, message });
}
}
```
3. 创建WebSocket服务类
在src目录下创建websocket文件夹,并在其中创建app.service.ts文件。代码如下:
```
class AppService {
constructor() {}
@InjectModel(User)
private readonly userService: User;
@InjectModel(Message)
private readonly messageService: Message;
}
```
4. 修改User和Message模型
在src目录下创建user文件夹,并在其中创建user.model.ts文件。代码如下:
```
class User extends Model implements BaseEntity {
constructor(obj?: any, config?: ConfigType) {
super(obj, config); // 调用父类构造函数
}
@Column()
name: string;
@Column({ type: "string", length: 20 })
password: string;
@Column({ default: true })
isActive: boolean = false;
static async findUserByName(name: string) {
const user = await this.findOne({ where: { name } }); // 根据用户名查找用户信息
return user;
}
}
```
在src目录下创建message文件夹,并在其中创建message.model.ts文件。代码如下:
```
class Message extends Model implements BaseEntity {
constructor(obj?: any, config?: ConfigType) {
super(obj, config); // 调用父类构造函数
}
@Column()
senderId: number;
@Column()
receiverId: number;
@Column({ type: "string" })
message: string;
static async sendMessage(messageData) {
const message = await this.create(messageData); // 创建消息记录
return message;
}
}
```
5. 修改main.ts文件
在src目录下创建main.ts文件。代码如下:
```
class AppModule extends Module {
constructor() {
super();
}
configure(consumer: Consumer) {
consumer.apply(
new ModuleReflectiveInterceptor(
this.selectorFactory, // 选择器工厂
this.metadataFactory, // 元数据工厂
this.metadataStore // 元数据存储
)
);
}
selectorFactory() {
return new Selector();
}
metadataFactory() {
return new Metadata();
}
metadataStore = {};
}
```
6. 启动项目并测试
运行以下命令启动项目:
```
ts src/main.ts
```
使用浏览器访问http://localhost:3000/call,输入两个用户的名称,即可进行1对1视频通话。
4.51KB
文件大小:
评论区