#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