我对此感到有点难过,并且对文件传输没有太多经验,所以希望我只是做些蠢事。
反正。问题。我正在从客户端向我的服务器发送一个文件块。这很好用。在发送过程中,我的客户端定期等待进度消息,因此我知道已发送了多少数据。但是,当我发送任何进度消息时,文件传输在服务器端超时。
我很确定这不是客户端代码的问题所以我会把它留下来。我已经评论了两条似乎在sendFeedback()方法中杀死东西的行。使用两个注释掉的行,waitforReadyRead()几乎会立即在主循环中超时。这几乎就像写出套接字阻止读取套接字上的任何信息一样,并阻止任何进一步的数据被读取。
感觉就像我在“同时”发送和接收时错过了带套接字的东西,但我在文档中找不到任何内容。
非常感谢任何想法。
文件接收代码:
const int Timeout = 30 * 1000;
QTcpSocket tcpSocket;
if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
emit error(tcpSocket.error());
return;
}
while(totalBytesRead<blockSize && !error && !success)
{
int toRead = blah blah blah
//loop until chosen chunk amount is available on socket
while (tcpSocket.bytesAvailable() < toRead)
{
//if no reply from socket, exit
if (!tcpSocket.waitForReadyRead(Timeout))
{
error=true;
break;
}
}
//read data
int actuallyRead = in.readRawData(datas, toRead);
//if data read
if(actuallyRead)
{
sendFeedback(&tcpSocket, actuallyRead);
//write the chunk to disk
out.writeRawData(datas,actuallyRead);
if(totalBytesRead == blockSize)
{
success = true;
break;
}
}
}
这是我的反馈功能:
void FileServerThread::sendFeedback(QTcpSocket* tcpSocket, int bytesActuallyRead)
{
//send some progress back to the client
QByteArray bytesReadArray;
QDataStream out(&bytesReadArray, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << bytesActuallyRead;
//feedback requires this but fails with these 2 lines
//tcpSocket->write(bytesReadArray);
//tcpSocket->waitForBytesWritten();
}