javascript – C++与nodejs的交互中出现的问题及实战代码

1. 问题

          首先,大背景是C++与js之间的交互(addon),可以是数据,函数等等。其中,js向C++传递一个json数据,这个数据是C++http网络请求,然后C++开辟一个子线程,建立一个tcp连接,然后进行http请求,最后将http请求的响应信息传递给js层,或者回调nodejs处理响应信息也可以。

其中,c++建立tcp连接和http请求是用一个类实现的,过程都是异步的,其中有一个回调函数on_read()会得到服务器的响应信息,并进行加工处理。
c++拿到js的json请求之后,便开始进行网络工作。

问题就是:
a. 不知道响应信息何时返回,无法像同步那样等待响应。
b. 在js的主线程之外不能使用v8的api,也就是说无法在on_read()回调函数中直接向js返回响应信息

2. 代码

class TCP_CLIENT : public IConnectionHandler{    bool isdone;public:    TCP_CLIENT(const char* host, int port, const char* data, Isolate *isolate, const FunctionCallbackInfo args)    {        this->host_ = host;        this->port_ = port;        this->request_data_ = data;        isolate_ = isolate;    }    ~TCP_CLIENT()    {        std::cout send_request(conn);    }    。。。。。。。。。        //服务器响应得到数据的回调    int on_read(int err, int bytes_transfered, IBaseConnection* conn, SharedBufferPtr buffer) override_final    {        if (err == 0 && bytes_transfered)        {            std::cout erase(bytes_transfered);            if (conn->is_established())            {                conn->stop();            }                        }        return 0;    }    //发送数据的回调    void on_write(int err, int bytes_transferred, IBaseConnection* conn, SharedBufferPtr buffer) override_final    {        if (err == 0 && bytes_transferred > 0)        {            std::cout " length() erase(bytes_transferred);        }        else {}    }private:    const char* host_;    int port_;    const char* request_data_;    http::ParserPtr response_parser_;    Isolate *isolate_;};const char* ToCString(const v8::String::Utf8Value& value){    return *value ? *value : "";}void entry(const FunctionCallbackInfo& args){    std::cout ThrowException(Exception::TypeError(v8::String::NewFromUtf8(isolate, "参数数量必须为二")));        return;    }    if (!args[0]->IsString() || !args[1]->IsNumber())    {        isolate->ThrowException(Exception::TypeError(            v8::String::NewFromUtf8(isolate, "参数类型错误")        ));    }    v8::String::Utf8Value str_temp(args[0]);    const char* data = ToCString(str_temp);    TCP_CLIENT* tcp_client;    if (args[1]->NumberValue() == 1)    {        tcp_client = new TCP_CLIENT(cms_host, cms_port, data, isolate, args);        tcp_client->perform(1);    }    else    {        tcp_client = new TCP_CLIENT(liteapp_host, liteapp_port, data, isolate, args);        tcp_client->perform(0);    }}void Init(Local exports){    NODE_SET_METHOD(exports, "http_request", entry);}NODE_MODULE(NODE_GYP_MODULE_NAME, Init)

登录后复制

尝试的方法:
a. 在主线程中设置while循环等待,子线程在on_read()向js返回数据之后,设置标志表示结束,这样能够正确结束,但是C++的异步请求就变成了一个同步,没有意义。
b. 在网上看到的libuv方法,但是仍然会出现libuv的工作函数无法得到C++异步响应消息的问题,主要就是异步消息与C++向node返回,线程之间如何处理的问题。

相关文章:

立即学习“Java免费学习笔记(深入)”;

NodeJS与Mysql的交互示例代码_javascript技巧

1. 问题

          首先,大背景是C++与js之间的交互(addon),可以是数据,函数等等。其中,js向C++传递一个json数据,这个数据是C++http网络请求,然后C++开辟一个子线程,建立一个tcp连接,然后进行http请求,最后将http请求的响应信息传递给js层,或者回调nodejs处理响应信息也可以。

其中,c++建立tcp连接和http请求是用一个类实现的,过程都是异步的,其中有一个回调函数on_read()会得到服务器的响应信息,并进行加工处理。
c++拿到js的json请求之后,便开始进行网络工作。

问题就是:
a. 不知道响应信息何时返回,无法像同步那样等待响应。
b. 在js的主线程之外不能使用v8的api,也就是说无法在on_read()回调函数中直接向js返回响应信息

2. 代码

以上就是javascript – C++与nodejs的交互中出现的问题及实战代码的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2744686.html

(0)

关于作者

上一篇 2025年3月8日 03:28:53
下一篇 2025年3月8日 03:29:01

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论