Heim  >  Artikel  >  Web-Frontend  >  Javascript – Probleme und praktische Codes in der Interaktion zwischen C++ und NodeJS

Javascript – Probleme und praktische Codes in der Interaktion zwischen C++ und NodeJS

php是最好的语言
php是最好的语言Original
2018-08-02 15:00:161533Durchsuche

1. Frage

Der große Hintergrund ist zunächst die Interaktion (Add-on) zwischen C++ und js, bei der es sich um Daten handeln kann. Funktionen usw. . Unter anderem überträgt js JSON-Daten an C++. Diese Daten sind eine C++-HTTP-Netzwerkanforderung. Dann öffnet C++ einen Sub-Thread, stellt eine TCP-Verbindung her und übergibt schließlich die Antwortinformationen der HTTP-Anfrage Die js-Schicht oder Es ist auch möglich, nodejs zurückzurufen, um die Antwortinformationen zu verarbeiten.

Unter anderem stellt C++ mithilfe einer Klasse eine TCP-Verbindung und eine HTTP-Anfrage her, und der Prozess ist asynchron. Es gibt eine Rückruffunktion on_read(), die die Antwortinformationen des Servers abruft und verarbeitet.
Nachdem C++ die JSON-Anfrage von js erhalten hat, beginnt es mit der Netzwerkarbeit.

Das Problem ist:
a. Ich weiß nicht, wann die Antwortinformationen zurückgegeben werden, und ich kann es kaum erwarten, die Antwort wie die Synchronisierung zu erhalten.
b. Die v8-API kann nicht außerhalb des Hauptthreads von js verwendet werden, was bedeutet, dass die Antwortinformationen nicht direkt an js in der Rückruffunktion on_read() zurückgegeben werden können

2 . Code

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)

Methoden zum Ausprobieren:
a. Richten Sie eine While-Schleife ein, um im Hauptthread zu warten. Setzen Sie das Flag, um das Ende anzuzeigen. Dies kann korrekt beendet werden, aber die asynchrone C++-Anforderung wird zu einer bedeutungslosen Synchronisierung.
b. Ich habe die libuv-Methode im Internet gesehen, aber es besteht immer noch das Problem, dass die libuv-Arbeitsfunktion die asynchrone C++-Antwortnachricht nicht erhalten kann. Das Hauptproblem besteht darin, wie die asynchrone Nachricht und C++ zum Knoten zurückkehren um es zwischen Threads zu handhaben.

Verwandte Artikel:

NodeJS- und MySQL-Interaktion, Beispielcode_Javascript-Kenntnisse

Detaillierte Einführung in C#-Code und JavaScript-Funktionen. Gegenseitige Aufrufe

Ähnliche Videos:

Nodejs + mongoDB praktische Entwicklung Weibo-System-Video-Tutorial

Das obige ist der detaillierte Inhalt vonJavascript – Probleme und praktische Codes in der Interaktion zwischen C++ und NodeJS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn