mirror of
https://gitee.com/Zhaoxin59/my-chat_-client.git
synced 2026-02-14 00:51:48 +08:00
add http and websocket
This commit is contained in:
121
network/netclient.cpp
Normal file
121
network/netclient.cpp
Normal 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
|
||||
59
network/netclient.h
Normal file
59
network/netclient.h
Normal file
@ -0,0 +1,59 @@
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QWebSocket>
|
||||
#include <QProtobufSerializer>
|
||||
#include <qnetworkreply.h>
|
||||
#include <QUuid>
|
||||
|
||||
#include "../model/data.h"
|
||||
|
||||
//此处为了避免“循环包含”的问题,就需要使用前置声明的方法
|
||||
// 代替包含头文件
|
||||
namespace model {
|
||||
class DataCenter;
|
||||
} //end namespace model
|
||||
|
||||
class model::DataCenter;
|
||||
|
||||
namespace network {
|
||||
class NetClient : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
//定义重要的常量,ip暂时使用本地的回环ip,端口号暂定的8000和8001
|
||||
const QString HTTP_URL = "http://127.0.0.1:8000";
|
||||
const QString WEBSOCKET_URL = "ws://127.0.0.1:8001/ws";
|
||||
|
||||
public:
|
||||
NetClient(model::DataCenter* dataCenter);
|
||||
|
||||
//验证网络的联通性
|
||||
void ping();
|
||||
|
||||
//初始化websocket
|
||||
void initWebSocket();
|
||||
|
||||
//发送身份认证请求
|
||||
void sendAuth();
|
||||
|
||||
//生成请求的Id
|
||||
static QString makeRequestId();
|
||||
|
||||
void getMyself(const QString& loginSessionId);
|
||||
private:
|
||||
model::DataCenter* dataCenter;
|
||||
|
||||
//http客户端
|
||||
QNetworkAccessManager httpClient;
|
||||
|
||||
//websocket客户端
|
||||
QWebSocket websocketClient;
|
||||
|
||||
//序列化器
|
||||
QProtobufSerializer serializer;
|
||||
signals:
|
||||
};
|
||||
} //end namespace network
|
||||
Reference in New Issue
Block a user