文本协议的程序
在TestMessage类中
1、使用QByteArray封装协议
类型、长度 ==> ASCII码,4字节
数据 ==> UTF-8编码
//QString类型,转为const char* 类型
ba.append(type.toStdString().c_str(), 4); ASCII码,4字节
ba.append(len.toStdString().c_str(), 4); ASCII码,4字节
不同的编码都放入QByteArray字节数组中。
长度len是数据转为utf-8后的长度。
QString类中提供 toUtf8()函数,QString也能将Utf-8解码。
在TestaMsgAssemble类中
1、assemble(...)装配函数
形参类型const char* , 直接将QByteArray类型对象传入,正确运行。或者使用ba.data()转为const char*
2、makeMessage()函数
类中用 QByteArray m_data; 而不是QString类型,在该函数中有一个条件判断,用到了
if( m_data.length() == m_length )
{
ret = new TestMessage(m_type, QString(m_data));
}
在tcpServer类中
1、使用QMap<QTcpSocket*, TestMsgAssemble*>
QMap<key,T>,字典排序,键类型Key必须提供operator<()函数,但是在该类中键类型Key没有主动提供operator<()函数呀??
若这样QMap<QTcpSocket*, TestMsgAssemble> 值为类对像,且TestMsgAssemble为QObject子类,如果不继承自QObject,就没问题。像唐老师写的那样,用指针也没问题。
出现error
C:\Qt\Qt5.6.1\5.6\mingw49_32\include\QtCore\qglobal.h:322: error:use of deleted function 'TestMsgAssemble& TestMsgAssemble::operator=(const TestMsgAssemble&)'
lastNode->value = avalue;
^
C:\Qt\Qt5.6.1\5.6\mingw49_32\include\QtCore\qglobal.h:322: error: 'QObject& QObject::operator=(const QObject&)' is private
Class &operator=(const Class &) Q_DECL_EQ_DELETE;
^
思考:可能是值类型T,需要提供复制构造函数和赋值构造函数。
" 对于Qt容器中的存储数据类型也有要求,这些数据必须是可以赋值的数据类型,
换句话说就是该数据类型必须有一个默认的构造函数(无参数构造函数)、一个复制构造函数(拷贝构造)和一个赋值操作符函数。
这些类(QObject及其他的子类)没有复制构造函数和赋值构造函数,解决的办法就是使用指向这些类的指针来作为存储类型。 "
2、sned(TestMessage& msg)
形参使用引用,在TestMessage类中,没有实现一个复制构造函数(拷贝构造)和一个赋值操作符函数。