>  기사  >  웹 프론트엔드  >  javascript - C++와 nodejs 간 상호작용의 문제점과 실제 코드

javascript - C++와 nodejs 간 상호작용의 문제점과 실제 코드

php是最好的语言
php是最好的语言원래의
2018-08-02 15:00:161524검색

1. Question

우선 배경은 C++과 js(애드온) 간의 상호작용입니다. ) , 데이터, 함수 등이 될 수 있습니다. 그 중 js는 json 데이터를 C++로 전송합니다. 이 데이터는 C++ http 네트워크 요청입니다. 그런 다음 C++는 하위 스레드를 열고 tcp 연결을 설정한 다음 http 요청을 만들고 마지막으로 http 요청의 응답 정보를 전달합니다. js 레이어 또는 nodejs를 콜백하여 응답 정보를 처리하는 것도 가능합니다.

그 중 tcp 연결을 설정하는 C++과 http 요청은 클래스를 사용하여 구현되며, 프로세스는 비동기식으로 서버의 응답 정보를 가져와 처리하는 콜백 함수 on_read()가 있습니다.
C++는 js의 json 요청을 받은 후 네트워크 작업을 시작합니다.

문제는
a입니다. 응답 정보가 언제 반환될지 모르고 동기화 같은 응답을 기다리고 있습니다.
b v8 API는 js의 메인 스레드 외부에서 사용할 수 없습니다. 즉, 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<Value> args)
    {
        this->host_ = host;
        this->port_ = port;
        this->request_data_ = data;
        isolate_ = isolate;
    }
    ~TCP_CLIENT()
    {
        std::cout << "~tcp_client" << std::endl;
    }
    
    /*callback handler implement回调接口实现*/

    //建立连接的回调
    void on_established(IBaseConnection*  conn) override_final
    {
        std::cout << "Connect Successful" << std::endl;
        this->send_request(conn);
    }

    。。。。。。。。。
    
    //服务器响应得到数据的回调
    int on_read(int err, int bytes_transfered, IBaseConnection* conn, SharedBufferPtr buffer) override_final
    {

        if (err == 0 && bytes_transfered)
        {
            std::cout << "In read, thread id is ----" << GetCurrentThreadId() << std::endl;
            buffer->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 << "Send Request Successful------>" << buffer->length() << std::endl;
            buffer->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 : "<string conversion failed>";
}

void entry(const FunctionCallbackInfo<Value>& args)
{
    std::cout << "In entry, process id is ----" << GetCurrentProcessId() << std::endl;
    std::cout << "In entry, thread id is ----" << GetCurrentThreadId() << std::endl;

    //启动一个线程执行tcp连接
    global_http_transfer_context_pool.run();

    Isolate* isolate = args.GetIsolate();

    if (args.Length() != 2)
    {
        isolate->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<Object> 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++가 노드로 반환되는 방식입니다. , 스레드 간 처리 방법.

관련 기사:


NodeJS 및 Mysql 상호 작용 샘플 code_javascript 기술

# 🎜🎜# C# 코드와 javaScript 함수 간의 상호 호출에 대한 자세한 소개

관련 동영상:


Nodejs + mongoDB 실무 개발 마이크로 보 시스템 비디오 튜토리얼

위 내용은 javascript - C++와 nodejs 간 상호작용의 문제점과 실제 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.