add http and websocket

This commit is contained in:
xyz
2025-06-10 20:17:39 +08:00
parent 030b5d6101
commit 68cd53a80c
23 changed files with 650 additions and 171 deletions

121
network/netclient.cpp Normal file
View File

@ -0,0 +1,121 @@
#include "netclient.h"
#include "../model/datacenter.h"
using namespace model;
namespace network {
NetClient::NetClient(model::DataCenter* dataCenter)
:dataCenter(dataCenter)
{
initWebSocket();
}
void NetClient::ping()
{
QNetworkRequest httpReq;
httpReq.setUrl(QUrl(HTTP_URL + "/ping"));
QNetworkReply* httpResp = httpClient.get(httpReq);
connect(httpResp, &QNetworkReply::finished, this, [=]() {
//到这里面,说明响应已经回了
if (httpResp->error() != QNetworkReply::NoError) {
//请求失败
LOG() << "HTTP请求失败" << httpResp->errorString();
httpResp->deleteLater();
return;
}
//获取到响应的body
QByteArray body = httpResp->readAll();
LOG() << "响应的内容: " << body;
httpResp->deleteLater();
});
}
void NetClient::initWebSocket()
{
//准备好所需要的信号槽
connect(&websocketClient, &QWebSocket::connected, this, [=]() {
LOG() << "webSocket 连接成功";
//连接成功之后,进行发送身份认证
sendAuth();
});
connect(&websocketClient, &QWebSocket::disconnected, this, [=]() {
LOG() << "webSocket 连接断开";
});
connect(&websocketClient, &QWebSocket::textMessageReceived, this, [=](const QString& message) {
LOG() << "webSocket 收到文本消息 " << message;
});
connect(&websocketClient, &QWebSocket::binaryMessageReceived, this, [=](const QByteArray& byteArray) {
LOG() << "webSocket 收到二进制的消息" << byteArray.length();
//TODO
});
//和服务器真正建立连接
websocketClient.open(WEBSOCKET_URL);
}
void NetClient::sendAuth()
{
bite_im::ClientAuthenticationReq req;
req.setRequestId(makeRequestId());
req.setSessionId(dataCenter->getLoginSessionId());
QByteArray body = req.serialize(&serializer);
websocketClient.sendBinaryMessage(body);
LOG() << "[WS身份认证] requestId= " << req.requestId() << ",loginSessionId= " << req.sessionId();
}
QString NetClient::makeRequestId()
{
//基本的要求确保每个请求的Id都是不重复的唯一的
//通过UUID实现上述的效果
return "R" + QUuid::createUuid().toString().sliced(25, 12);
}
//在这个函数内部,完成具体的网络通信即可
void NetClient::getMyself(const QString& loginSessionId)
{
//构造出HTTP请求body部分
bite_im::GetUserInfoReq req;
req.setRequestId(makeRequestId());
req.setSessionId(loginSessionId);
QByteArray body = req.serialize(&serializer);
LOG() << "获取个人信息: requestId=" << req.requestId() << ", loginSessionId=" << loginSessionId;
//构造出HTTP请求
QNetworkRequest httpReq;
httpReq.setUrl(QUrl(HTTP_URL + "/service/user/get_user_info"));
httpReq.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-protobuf");
//发起HTTP请求
QNetworkReply* httpResp = httpClient.post(httpReq, body);
//通过信号槽,获取到当前的响应
connect(httpResp, &QNetworkReply::finished, this, [=]() {
if (httpResp->error() != QNetworkReply::NoError) {
//说明HTTP请求出错了
LOG() << "HTTP error: " << httpResp->errorString();
httpResp->deleteLater();
return;
}
//说明拿到了body
QByteArray respBody = httpResp->readAll();
//针对body进行反序列化,解析成对象
bite_im::GetUserInfoRsp respObj;
respObj.deserialize(&serializer, respBody);
//判定一下业务上是否出错
if (!respObj.success()) {
LOG() << "requestId= " << respObj.requestId() << ", errmsg=" << respObj.errmsg();
httpResp->deleteLater();
return;
}
//继续处理后续的业务逻辑
});
}
} //end namespace network