四、Mediasoup Js和 C++ 管道通信的过程

本文详细描述了JavaScript和C++之间的通信机制,涉及使用`_consumerSocket`和`producerSocket`进行数据交换,以及如何通过`uv_read_start`和`uv_write`进行底层操作。特别关注了接收和发送过程中的回调机制及事件通知的实现。

整体分为两部分

1、 js对c++读写消息,_consumerSocket和producerSocket

2、c++对js读写消息,c++收到都是底层都是通过libuv的uv_read_start和uv_write

目录

一、js接收c++数据

二、js主动调用c++,通过producerSocket.write

三、C++底层读取JS数据

四、c++写数据给js,主要两种形式


一、js接收c++数据

channel.js 构造函数注册监听器
this._consumerSocket.on('data', (buffer) => {})

//真正的处理有效数据其实在processMessage

processMessage(msg) {
        // If a response, retrieve its associated request.
        if (msg.id) {
            const sent = this.#sents.get(msg.id);
            if (!sent) {
                logger.error('received response does not match any sent request [id:%s]', msg.id);
                return;
            }
            if (msg.accepted) {
                logger.debug('request succeeded [method:%s, id:%s]', sent.method, sent.id);
                sent.resolve(msg.data);
            }
        else if (msg.targetId && msg.event) {
            setImmediate(() => this.emit(String(msg.targetId), msg.event, msg.data));
        }


上层需要回调response就带msg.id
不带id属于事件通知,最终会调用 this.emit(msg.targetId, msg.event, msg.data);  发送出去

二、js主动调用c++,通过producerSocket.write

async request(method, handlerId, data) {
        this.#nextId < 4294967295 ? ++this.#nextId : (this.#nextId = 1);
        const id = this.#nextId;
        logger.debug('request() [method:%s, id:%s]', method, id);
        if (this.#closed) {
            throw new errors_1.InvalidStateError('Channel closed');
        }
        const request = `${id}:${method}:${handlerId}:${JSON.stringify(data)}`;
        if (Buffer.byteLength(request) > MESSAGE_MAX_LEN) {
            throw new Error('Channel request too big');
        }
        // This may throw if closed or remote side ended.
        this.#producerSocket.write(Buffer.from(Uint32Array.of(Buffer.byteLength(request)).buffer));
        this.#producerSocket.write(request);
        //构建response的callback,添加id,在processMessage进行回调
        return new Promise((pResolve, pReject) => {
            const sent = {
        &nb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值