Я немного озадачен этим и не имею большого опыта в передаче файлов, так что, надеюсь, я просто делаю что-то глупое.
Тем не мение. Эта проблема. Я отправляю файл частями от моего клиента на мой сервер. Это отлично работает. Во время отправки мой клиент периодически ожидает сообщения о прогрессе, поэтому я знаю, сколько данных было отправлено. Однако когда я отправляю какие-либо сообщения о прогрессе, время передачи файла на стороне сервера истекает.
Я уверен, что это не проблема с кодом на стороне клиента, поэтому я опущу это. Я прокомментировал две строки, которые, кажется, убивают вещи в методе 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();
}
Задача ещё не решена.
Других решений пока нет …