1. Frage
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