1. Question
그 중 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 함수 간의 상호 호출에 대한 자세한 소개