C++ 如何在Qt中实现一个简单的tcp连接?
我试图修改C++ 如何在Qt中实现一个简单的tcp连接?,c++,qt,qtcpsocket,qtcpserver,C++,Qt,Qtcpsocket,Qtcpserver,我试图修改Qt网络教程,并实现如下: quint16 blockSize; void Client::readData() { qDebug() << "Received Data!"; QByteArray data; QDataStream in(tcpSocket); in.setVersion(QDataStream::Qt_4_0); if (blockSize == 0) { if (tcpSocket->
Qt
网络教程,并实现如下:
quint16 blockSize;
void Client::readData()
{
qDebug() << "Received Data!";
QByteArray data;
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_0);
if (blockSize == 0) {
if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
return;
in >> blockSize;
}
qDebug() << "Received DATA II with blocksize " << blockSize;
if (tcpSocket->bytesAvailable() < blockSize)
{
qDebug() << tcpSocket->bytesAvailable() << ' ' << blockSize;
return;
}
qDebug() << "Received DATA III";
in >> data;
qDebug() << data;
QByteArray dbg = data; // create a copy to not alter the buffer itself
dbg.replace('\\', "\\\\"); // escape the backslash itself
dbg.replace('\0', "\\0"); // get rid of 0 characters
dbg.replace('\n', "\\n");
//dbg.replace('"', "\\\""); // more special characters as you like
qDebug() << dbg;
QString data_string(data);
qDebug() << "Emitting Signal";
emit Client::gotData(data_string);
}
void Server::sendData(void)
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << "Hello World, this is a very long text!";
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
qDebug() << "First number is: " << (quint16)(block.size() - sizeof(quint16));
qDebug() << "Blocksize is: " << block.size() << "with quint size: " << sizeof(quint16);
qDebug() << "Sending data!";
//Debug
QByteArray dbg = block; // create a copy to not alter the buffer itself
dbg.replace('\\', "\\\\"); // escape the backslash itself
dbg.replace('\0', "\\0"); // get rid of 0 characters
dbg.replace('\n', "\\n");
//dbg.replace('"', "\\\""); // more special characters as you like
qDebug() << dbg;
connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));
clientConnection->write(block);
//clientConnection->disconnectFromHost();
}
我的第一个问题是:所有的\0
从哪里来?就我对代码的理解而言,首先我要创建一个0
,然后我写文本,然后我回到前面,写块的完整大小。是因为(quint16)
的大小吗?当不输入任何内容时,我得到的是\0\0
,大小为0,这是正确的。上面示例的大小是43,对应于ascii中的+
(该符号也在上面的块中)。我的第二个问题是:My
readData()
-函数无法识别块大小(它总是返回450作为块大小,这显然是错误的)。为什么?我错过什么了吗?更新:更改
QByteArray数据后代码>到QString数据代码>我的问题消失了,我的代码中没有更奇怪的\0
应该使用正确的数据类型->头部->桌面块大小的确切类型是什么?quint16
是类型,只是将它添加到主要问题中,它在真实代码中是否正确初始化?(例如,在该类的构造函数中)我认为是这样,在Client::Client(){…blockSize=0;…}这看起来很奇怪。尝试添加调试语句,以确保在输入read时,它最初确实为零。
First number is: 43
Blocksize is: 45 with quint size: 2
Sending data!
"\0+\0\0\0'Hello World, this is a very long text!\0"