我是通过套接字传输TCP文件的新手。所以就自我而言,我想修改示例" Loopback"一旦建立连接,使其从服务器向客户端发送大文件(例如100Mb到2Gb)。 我的问题是,我不知道如何分割文件,以便现在传输必须完成。 让我插入一段代码,以便更容易理解:
server.cpp
void Dialog::acceptConnection()
{
tcpServerConnection = tcpServer.nextPendingConnection();
connect(tcpServerConnection,SIGNAL(connected()), this, SLOT(startTransfer()));
connect(tcpServerConnection, SIGNAL(bytesWritten(qint64)), this, SLOT(updateServerProgress(qint64)));
connect(tcpServerConnection, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
serverStatusLabel->setText(tr("Accepted connection"));
startTransfer();
}
void Dialog::startTransfer()
{
file = new QFile("file_path");
if (!file->open(QIODevice::ReadOnly))
{
serverStatusLabel->setText("Couldn't open the file");
return;
}
int TotalBytes = file->size();
bytesToWrite = TotalBytes - (int)tcpServerConnection->write(<-WHAT HERE!!!->));
serverStatusLabel->setText(tr("Connected"));
}
void Dialog::updateServerProgress(qint64 numBytes)
{
bytesWritten += (int)numBytes;
// only write more if not finished and when the Qt write buffer is below a certain size.
if (bytesToWrite > 0 && tcpServerConnection->bytesToWrite() <= 4*PayloadSize)
bytesToWrite -= (int)tcpServerConnection->write(<-WHAT HERE!!!->));
serverProgressBar->setMaximum(TotalBytes);
serverProgressBar->setValue(bytesWritten);
serverStatusLabel->setText(tr("Sent %1MB").arg(bytesWritten / (1024 * 1024)));
}
我已经看到一些使用readAll()
的解决方案,但我不认为qt可以处理内部有2Gb数据的缓冲区...
所以,如上所述,我的问题是如何通过写tcpServerConnection
来提交文件?我想知道是否建议将QDataStream用于此目的(QDataStream out(&file, QIODevice::WriteOnly);
)。
谢谢!
PD:请注意代码上的标记&lt; -WHAT HERE !!! - &gt; 。
答案 0 :(得分:2)
好的,感谢 Basile Starynkevitch ,我找到了解决方案。 它就像设置一样简单:
buffer = file->read(PayloadSize);
然后通过Tcp发送。在本地网络中,我实现了在40.11秒内传输397Mb。 谢谢,