大家好!
我在做一个基于TCP的文件传输程序。一个Server端,一个Client端。
Client端在连接到服务器后发送文件名。然后发送文件数据。文件名与文件数据用0x0001和0x0002分别代替,0x0003代表文件传输完成。
传输中用的数据格式为:
[quint32] [quint16] [QByteArray]
数据长度 文件名/文件数据/传输完成 文件数据
Client端在发送完文件后发送代表文件传输完成的包。
Server端在incomingConnection中启动一个新线程。在新线程中构建一个QTcpSocket对象。在有数据可读时对到来的数据进行处理。
但是现在的问题是:新线程中的QTcpSocket会随机收到一个disconnected(),有时早有时晚。但是在Client端会到数据发送完成后才会
调用disconnectFromHost。调试的时候是Client端在刚刚连接上发送完文件名的那一个包后调用waitForBytesWritten(-1)时就会返回false。
错误信息是“进程计算机已经关闭连接”。
我发送端的代码是
void ntpClient::on_tcpConnected()
{
QString filePath = ui.lineEdit_2->text();
QString fileName = filePath;
fileName = fileName.remove(0, fileName.lastIndexOf('/')+1);
QFile file(filePath);
if(!file.open(QIODevice::ReadOnly))
throw 0;
quint32 size;
QByteArray outArray;
QDataStream out(&outArray, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_3);
out << quint16(0x0001) << fileName.toUtf8();
size = outArray.size();
tcpSocket->write((char*)&size, sizeof(quint32));
tcpSocket->write(outArray.data(), size);
if(!tcpSocket->waitForBytesWritten(-1))
{
messageBox(tcpSocket->errorString());
return;
}
do
{
out.device()->seek(0);
outArray.clear();
out << quint16(0x0002) << file.read(0xFFF0);
size = outArray.size();
tcpSocket->write((char*)&size, sizeof(quint32));
tcpSocket->write(outArray.data(), size);
if(!tcpSocket->waitForBytesWritten(-1))
{
messageBox(tcpSocket->errorString());
return;
}
}
while(!file.atEnd());
file.close();
out.device()->seek(0);
outArray.clear();
out << quint16(0x0003) << tr("EOF");
size = outArray.size();
tcpSocket->write((char*)&size, sizeof(quint32));
tcpSocket->write(outArray.data(), size);
if(!tcpSocket->waitForBytesWritten(-1))
{
messageBox(tcpSocket->errorString());
return;
}
tcpSocket->waitForDisconnected(-1);
}
接收端的代码是:
void clientThread::readData()
{
if(blockSize == 0)
{
if(tcpSocket->bytesAvailable() < sizeof(quint32))
return;
tcpSocket->read((char*)&blockSize, quint64(sizeof(quint32)));
//qDebug() << "Recved block size " << blockSize << ".";
//qDebug() << "\tFrom: " << tcpSocket->peerAddress().toString() << ", port: " << tcpSocket->peerPort() << ".";
}
if(tcpSocket->bytesAvailable() < quint64(blockSize))
return;
QByteArray bufArray;
bufArray = tcpSocket->read(blockSize);
proccessData(bufArray);
blockSize = 0;
}
void clientThread::proccessData(QByteArray &array)
{
QDataStream in(&array, QIODevice::ReadOnly);
in.setVersion(QDataStream::Qt_4_3);
quint16 key;
QByteArray data;
in >> key >> data;
qDebug() << "\tKey: " << key << "\tDataSize: " << data.size();
if(key == 0x0001)
{
fileName = fileName.fromUtf8(data.data());
file.setFileName(fileName);
if(file.exists(fileName))
{
qDebug() << "File was exists. i will remove it.";
//tcpSocket->disconnectFromHost();
//tcpSocket->waitForDisconnected();
file.remove(fileName);
//emit finished();
}
if(!file.open(QIODevice::WriteOnly))
{
qDebug() << "File can not be opend.";
throw 2;
}
qDebug() << "Store file " << file.fileName();
}
if(key == 0x0002)
{
qDebug() << "Wite data to file";
file.write(data);
file.flush();
}
if(key == 0x0003)
{
qDebug() << "Finished.";
file.close();
tcpSocket->disconnectFromHost();
emit finished();
}
}
大家帮我看看是什么问题啊。