• 6632阅读
  • 2回复

QT下用QTcpSocket传输文件, 调用了QTcpSocket::write()但是怎么没有bytesWritten信号上来 [复制链接]

上一主题 下一主题
离线sac_meteor
 
只看楼主 倒序阅读 楼主  发表于: 2011-09-21
关键词: QT4网络
最近看Qt 的网络编程关于Tcp传输文件的问题, (按照这个文章实现的http://www.yafeilinux.com/?p=806),
但是我很郁闷的是为什么我的tcpSender中的bytesWritten(quint64)信号没有上来, 刚开始的连接都是正常
的。 vs2008下的QT工程见附件, 望高手指点。

tcptranfile.rar (2321 K) 下载次数:28 vs2008_qt_tcptranfile_sln

tcpsender.cpp
  1. #include <qfiledialog.h>
  2. #include "tcpsender.h"
  3. tcpSender::tcpSender(QWidget *parent, Qt::WFlags flags)
  4. : QMainWindow(parent, flags)
  5. {
  6. loadSize = 4 * 1024;
  7. totalBytes = 0;
  8. bytesWrittenAA = 0;
  9. bytesToWrite = 0;
  10. tcpClient = new QTcpSocket(this);
  11. connect(tcpClient, SIGNAL(connected()), this, SLOT(startTransfer()));
  12. connect(tcpClient, SIGNAL(bytesWritten(quint64)), this, SLOT(updateClientProgress(qint64)));
  13. connect(tcpClient, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
  14. ui.setupUi(this);
  15. ui.sendButton->setEnabled(false);
  16. }
  17. tcpSender::~tcpSender()
  18. {
  19. }
  20. void tcpSender::OpenFile()
  21. {
  22. fileName = QFileDialog::getOpenFileName(this);
  23. if (!fileName.isEmpty())
  24. {
  25.   ui.sendButton->setEnabled(true);
  26.   ui.clientStatusLabel->setText(tr("打开文件 %1成功!").arg(fileName));
  27. }
  28. }
  29. void tcpSender::send()
  30. {
  31. ui.sendButton->setEnabled(false);
  32. bytesWrittenAA = 0;
  33. ui.clientStatusLabel->setText(tr("连接中..."));
  34. tcpClient->connectToHost(ui.hostLineEdit->text(), ui.portLineEdit->text().toInt());
  35. }
  36. void tcpSender::startTransfer()
  37. {
  38. localFile = new QFile(fileName);
  39. if (!localFile->open(QFile::ReadOnly))
  40. {
  41.   qDebug() << "open file error!";
  42.   return;
  43. }
  44. totalBytes = localFile->size();
  45. QDataStream sendOut(&outBlock, QIODevice::WriteOnly);
  46. sendOut.setVersion(QDataStream::Qt_4_6);
  47. QString currentFileName = fileName.right(fileName.size() - fileName.lastIndexOf("/") - 1);
  48. sendOut << qint64(0) << qint64(0) << currentFileName;
  49. totalBytes += outBlock.size();
  50. sendOut.device()->seek(0);
  51. sendOut << totalBytes << qint64((outBlock.size() - sizeof(qint64) * 2));
  52. bytesToWrite = totalBytes - tcpClient->write(outBlock);
  53. ui.clientStatusLabel->setText(tr("已连接"));
  54. outBlock.resize(0);
  55. }
  56. void tcpSender::updateClientProgress(qint64 numBytes)
  57. {
  58. bytesWrittenAA += numBytes;
  59. if (bytesWrittenAA > 0)
  60. {
  61.   outBlock = localFile->read(qMin(bytesToWrite, loadSize));
  62.   bytesToWrite -= (int)tcpClient->write(outBlock);
  63.   outBlock.resize(0);
  64. }
  65. else
  66. {
  67.   localFile->close();
  68. }
  69. ui.clientProgressBar->setMaximum(totalBytes);
  70. ui.clientProgressBar->setValue(bytesWrittenAA);
  71. if (bytesWrittenAA == totalBytes)
  72. {
  73.   ui.clientStatusLabel->setText(tr("传输文件 %1成功").arg(fileName));
  74.   localFile->close();
  75.   tcpClient->close();
  76. }
  77. }
  78. void tcpSender::displayError(QAbstractSocket::SocketError)
  79. {
  80. qDebug() << tcpClient->errorString();
  81. tcpClient->close();
  82. ui.clientProgressBar->reset();
  83. ui.clientStatusLabel->setText(tr("客户端就绪"));
  84. ui.sendButton->setEnabled(true);
  85. }
  86. void tcpSender::on_openButton_clicked()
  87. {
  88. OpenFile();
  89. }
  90. void tcpSender::on_sendButton_clicked()
  91. {
  92. send();
  93. }


//tcpreceiver.cpp

  1. #include "tcpreceiver.h"
  2. tcpReceiver::tcpReceiver(QWidget *parent, Qt::WFlags flags)
  3. : QMainWindow(parent, flags)
  4. {
  5. totalBytes = 0;
  6. bytesReceived = 0;
  7. fileNameSize = 0;
  8. connect(&tcpServer, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
  9. ui.setupUi(this);
  10. }
  11. tcpReceiver::~tcpReceiver()
  12. {
  13. }
  14. void tcpReceiver::start()
  15. {
  16. ui.startButton->setEnabled(false);
  17. bytesReceived = 0;
  18. if (!tcpServer.listen(QHostAddress("192.168.0.15")/*QHostAddress::LocalHost*/, 6666))
  19. {
  20.   qDebug() << tcpServer.errorString();
  21.   tcpServer.close();
  22.   return;
  23. }
  24. ui.serverStatusLabel->setText(tr("监听!!!"));
  25. }
  26. void tcpReceiver::acceptConnection()
  27. {
  28. tcpServerConnect = tcpServer.nextPendingConnection();
  29. connect(tcpServerConnect, SIGNAL(readyRead()), this, SLOT(updateServerProgress()));
  30. connect(tcpServerConnect, SIGNAL(QAbstractSocket::SocketError), this, SLOT(displayError()));
  31. ui.serverStatusLabel->setText(tr("接收连接"));
  32. tcpServer.close();
  33. }
  34. void tcpReceiver::updateServerProgress()
  35. {
  36. QDataStream in(tcpServerConnect);
  37. in.setVersion(QDataStream::Qt_4_6);
  38. if (bytesReceived <= sizeof(qint64) * 2)
  39. {
  40.   if ((tcpServerConnect->bytesAvailable() >= sizeof(qint64) * 2) && (fileNameSize == 0))
  41.   {
  42.    in >> totalBytes >> fileNameSize;
  43.    bytesReceived += sizeof(qint64) * 2;
  44.   }
  45.   if ((tcpServerConnect->bytesAvailable() >= fileNameSize) && (fileNameSize != 0))
  46.   {
  47.    in >> fileName;
  48.    ui.serverStatusLabel->setText(tr("接受文件 %1...").arg(fileName));
  49.    bytesReceived += fileNameSize;
  50.    localFile = new QFile(fileName);
  51.    if (!localFile->open(QFile::WriteOnly))
  52.    {
  53.     qDebug() << "open file error!";
  54.     return;
  55.    }
  56.   }
  57.   else return;
  58. }
  59. if (bytesReceived < totalBytes)
  60. {
  61.   bytesReceived += tcpServerConnect->bytesAvailable();
  62.   inBlock = tcpServerConnect->readAll();
  63.   localFile->write(inBlock);
  64.   inBlock.resize(0);
  65. }
  66. ui.serverProgressBar->setMaximum(totalBytes);
  67. ui.serverProgressBar->setValue(bytesReceived);
  68. if (bytesReceived == totalBytes)
  69. {
  70.   tcpServerConnect->close();
  71.   localFile->close();
  72.   ui.startButton->setEnabled(true);
  73.   ui.serverStatusLabel->setText(tr("接收文件 %1 成功").arg(fileName));
  74. }
  75. }
  76. void tcpReceiver::displayError(QAbstractSocket::SocketError)
  77. {
  78. qDebug() << tcpServerConnect->errorString();
  79. tcpServerConnect->close();
  80. ui.serverProgressBar->reset();
  81. ui.serverStatusLabel->setText(tr("服务器就绪"));
  82. ui.startButton->setEnabled(true);
  83. }
  84. void tcpReceiver::on_startButton_clicked()
  85. {
  86. start();
  87. }

离线sac_meteor
只看该作者 1楼 发表于: 2011-09-21
自己顶一下
离线sac_meteor
只看该作者 2楼 发表于: 2011-09-22
没有人知道?
快速回复
限100 字节
 
上一个 下一个