第七天项目日记
1、今日总结
完成有关弹幕的相关内容的开发 用户发送弹幕之后,开播的人显示弹幕,观看直播的人也显示弹幕 自己发的弹幕用绿色的框框起来 别人发的弹幕直接显示
2、设计思路
参考连接. 对于弹幕的实现,这里使用了定时器,弹幕的队列用vector显示,然后vector中存入Qlabel类,发送或者接收到弹幕之后就给vector中添加对应的label 对于弹幕的移动用QTimer 每20ms移动一次移动到边界之后自动消失 弹幕的长度根据字符串来自适应,弹幕移动到边界之后自动消失并且清除缓存
弹幕的发送流程,对于加入直播间的客户端,服务器端进行记录加入的房间号,对于开播的直播间来说,记录开播的房间号。
发送弹幕之后,客户端发送消息给服务器,服务器转发弹幕消息,转发给对于房间号开播的客户端以及正在观看该直播间的用户。 客户端收到消息之后,随机现在弹幕的位置在视频界面。 (后面有时间会整理一个流程图出来)
3、代码说明
服务器
服务器主要是对消息的接收和发送的修改
首先是加入直播间和离开直播间 离开直播间只需要清空自定义tcpsocket的类的加入直播间的房间名称即可 然后是弹幕消息的格式
主要修改以上四个文件
message.h
增加了三种消息
myjson.h
消息的打包和解析
#ifndef MYJSON_H
#define MYJSON_H
#include
#include
#include
#include
#include
#include
class MyJson
{
public:
MyJson();
//解析用户名和密码
QString name_pswd_info(QString message,QString &pswd,QString &name);
//打包直播刷新消息
QString pack_live_flush(QString action,QStringList name_list);
//解析加入直播json
QString join_info(QString message,QString &room_name);
//解析弹幕消息
QString barrage_info(QString message,QString &from, QString &room_name, QString &desc);
//打包返回的弹幕消息
QString pack_ret_barrage_info(QString from, QString desc);
};
#endif // MYJSON_H
myjson.cpp
#include "myjson.h"
MyJson::MyJson()
{
}
QString MyJson::name_pswd_info(QString message, QString &pswd, QString &name)
{
QByteArray bytes = message.toUtf8();
QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) {
// 解析未发生错误
if (doucment.isObject()){
QJsonObject object = doucment.object(); // 转化为对象
if (object.contains("Name")) {
QJsonValue value = object.value("Name");
if (value.isString()) {
name = value.toString();
qDebug() << "Name : " << name;
}
}else{
return "json_error_no_name";
}
if (object.contains("password")) {
QJsonValue value = object.value("password");
if (value.isString()) {
pswd = value.toString();
qDebug() << "pswd : " << pswd;
}
}else{
return "json_error_no_pswd";
}
}else{
return "json is no object";
}
}else{
return "json error";
}
return "success";
}
QString MyJson::pack_live_flush(QString action, QStringList name_list)
{
QJsonObject json;
json.insert("action",action);
QJsonArray json_array;
for (int i = 0; i < name_list.size(); ++i){
json_array.insert(i,name_list.at(i));
}
json.insert("name",json_array);
QJsonDocument document;
document.setObject(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);
return strJson;
}
QString MyJson::join_info(QString message, QString &room_name)
{
QByteArray bytes = message.toUtf8();
QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) {
// 解析未发生错误
if (doucment.isObject()){
QJsonObject object = doucment.object(); // 转化为对象
if (object.contains("join")) {
QJsonValue value = object.value("join");
if (value.isString()) {
room_name = value.toString();
qDebug() << "join : " << room_name;
}
}else{
return "json_error_no_join";
}
}else{
return "json is no object";
}
}else{
return "json error";
}
return "success";
}
QString MyJson::barrage_info(QString message, QString &from, QString &room_name, QString &desc)
{
QByteArray bytes = message.toUtf8();
QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);
if (!doucment.isNull(