GrpcPrint/PrintC/DataManage/StreamClient.cpp
2024-03-15 12:31:34 +08:00

103 lines
2.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StreamClient.h"
#include "LocalAddr.h"
StreamClient::StreamClient()
: m_localIp("0.0.0.0")
, m_port(50010)
, m_readQuitFlag(false)
, m_writeQuitFlag(false)
, m_dataCallBack(nullptr)
, m_handlePtr(nullptr){
}
StreamClient::~StreamClient() {
m_readQuitFlag = true;
m_writeQuitFlag = true;
}
void StreamClient::Init() {
m_localIp = LocalAddr().GetSystemIpAddress();
std::string target_str = m_localIp +":"+ std::to_string(m_port);
m_stubTwo = Stream::NewStub(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));
AllStream();
}
bool StreamClient::GetPushMsg(WriteData& msg) {
std::lock_guard<std::mutex> lock(m_msgLock);
if (m_msgList.empty()) {
return false;
}
else {
msg = (*m_msgList.front());
delete m_msgList.front();
m_msgList.pop_front();
return true;
}
}
void StreamClient::SetPushMsg(WriteData* msg) {
std::lock_guard<std::mutex> lock(m_msgLock);
m_msgList.push_back(msg);
}
void StreamClient::AllStream() {
ClientContext context;
std::unique_ptr<grpc::ClientReaderWriter<RequestInfo, ResponseInfo>> stream(m_stubTwo->AllStream(&context));
std::thread reader([this, &stream] {
ResponseInfo readInfo;
while (!m_readQuitFlag && stream->Read(&readInfo)) {
ReadData readData;
readData.dataType = (READTYPE)readInfo.datatype();
readData.nameKey = readInfo.namekey();
readData.strValue = readInfo.strvalue();
readData.valueType =(DATATYPE)readInfo.valuetype();
readData.result = readInfo.result();
printf("服务端消息dataType:%d,nameKey:%s, strvalue:%s,valueType:%d\n",
readData.dataType, readData.nameKey.c_str(), readInfo.strvalue().c_str(),readData.valueType);
if (m_dataCallBack) {
m_dataCallBack(m_handlePtr, readData);
}
}
});
std::thread writer([this, &stream] {
while(!m_writeQuitFlag){
WriteData writeData;
if (GetPushMsg(writeData)) {
RequestInfo request;
request.set_namekey("hello server." + std::to_string(std::time(nullptr)));
request.set_datatype((::stream::RequestInfo_Status)writeData.dataType);
request.set_strvalue(writeData.strValue);
request.set_valuetype((::stream::RequestInfo_TYPE)writeData.valueType);
stream->Write(request);
}
else {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
stream->WritesDone();
});
reader.join();
writer.join();
Status status = stream->Finish();
if (!status.ok()) {
std::cout << "RPC failed: " << status.error_message() << std::endl;
}
}