在线程类中 tcpsocket用write些数据时 数据不能发送出去

ewerwerwerer 2012-05-18 09:41:54
直接上代码

HandleTask.h

#ifndef HANDLETASK_H
#define HANDLETASK_H
#include <QThread>
#include <QSemaphore>
#include "DataStructure.h"


class CHandleTask : public QThread
{
Q_OBJECT
public:
CHandleTask(const CTask& task);
~CHandleTask();
void run();
void sendResult();
void sendMsg(MSGTYPE msgType);
void readFile();
int getThreadNum();
private:
static int threadNum;
CTask m_task;
qint64 totalBytes; //存放总大小信息
qint64 bytesReceived; //已收到数据的大小
qint64 fileNameSize; //文件名的大小信息
QString fileName; //存放文件名
QFile *localFile; //本地文件
QByteArray inBlock; //读取文件
int fileNum; //读取需要传递的文件数
int fileTransferedNum; //已经传递的文件个数

signals:
void ThreadMsg(/*const CTask&,*/const QString&);

};

#endif // HANDLETASK_H


HandleTask.cpp

#include "HandleTask.h"
#include <QMessageBox>
#include <QSemaphore>
#include <QDir>

static QSemaphore MaxThreadRunning(30);
QWaitCondition anotherThread;

int CHandleTask::threadNum = 0;

CHandleTask::CHandleTask(const CTask& task)
{
m_task = task;
totalBytes = 1000; //存放总大小信息
bytesReceived = 0; //已收到数据的大小
fileNameSize = 0; //文件名的大小信息
fileNum = 1;//task.net_msg.parameterNum;
fileTransferedNum = 0;
threadNum++;
}

CHandleTask::~CHandleTask()
{
threadNum--;
}

/* 当前建立的处理文件的线程的个数(包括正在运行或阻塞的) */
int CHandleTask::getThreadNum()
{
return threadNum;
}

void CHandleTask::run()
{
//向客户端说明可以传输文件
//MaxThreadRunning.acquire();


QByteArray block;
QString ss = m_task.tcpSocket->peerAddress().toString();
QString gs = tr("%1").arg(m_task.tcpSocket->peerPort());
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << m_task.net_msg.userName;
out << m_task.net_msg.userPassword << msgType
<< m_task.net_msg.nID << m_task.net_msg.filename << m_task.net_msg.totalSize;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
m_task.tcpSocket->waitForConnected(5000);
int t = (int)m_task.tcpSocket->state();
m_task.tcpSocket->write(block);

sendMsg(MSG_FILE_TRANSFER);
//准备传输文件
while(bytesReceived != totalBytes || fileNum != fileTransferedNum)
{
if(m_task.tcpSocket->isReadable());
readFile();
sleep(1);
}
/*! 处理文件 */
sendResult();
// anotherThread.wakeOne();
// MaxThreadRunning.release();
}

void CHandleTask::readFile()
{
QDataStream in(m_task.tcpSocket);
in.setVersion(QDataStream::Qt_4_6);
if(bytesReceived <= sizeof(qint64)*2)
{ //如果接收到的数据小于16个字节,那么是刚开始接收数据,我们保存到//来的头文件信息

if((m_task.tcpSocket->bytesAvailable() >= sizeof(qint64)*2)&& (fileNameSize == 0))
{ //接收数据总大小信息和文件名大小信息
in >> totalBytes >> fileNameSize;
bytesReceived += sizeof(qint64) * 2;
}

if((m_task.tcpSocket->bytesAvailable() >= fileNameSize)
&& (fileNameSize != 0))
{ //接收文件名,并建立文件
in >> fileName;
//InsertLog(tr("accept file %1 …").arg(fileName));
//emit ThreadMsg(tr("accept file %1 …").arg(fileName));
bytesReceived += fileNameSize;
QString path = tr("%1/%2/%3").arg("FileToBeSolve",
m_task.net_msg.userName,QString::number(m_task.net_msg.nID,10));
QDir newDir;
newDir.mkpath(path);
localFile = new QFile(tr("%1/%2").arg(path,fileName));

if(!localFile->open(QFile::WriteOnly))
{
qDebug() << "open file error!";
return;
}
}

else return;
}


if(bytesReceived < totalBytes)
{ //如果接收的数据小于总数据,那么写入文件
inBlock = m_task.tcpSocket->read(1024*1024);
bytesReceived += inBlock.size();
localFile->write(inBlock);
inBlock.resize(0);
}

//更新进度条
if(bytesReceived == totalBytes)
{
//接收数据完成时
localFile->close();
bytesReceived = 0;
totalBytes = 10000;
fileTransferedNum++;
fileNameSize = 0;
//InsertLog(tr("%1 receive successfully!").arg(fileName));
// emit ThreadMsg(tr("%1 receive successfully!").arg(fileName));
}
}

/* 告诉客户端程序可以进行文件传输 */
void CHandleTask::sendMsg(MSGTYPE msgType)
{
QByteArray block;
QString ss = m_task.tcpSocket->peerAddress().toString();
QString gs = tr("%1").arg(m_task.tcpSocket->peerPort());
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << m_task.net_msg.userName;
out << m_task.net_msg.userPassword << msgType
<< m_task.net_msg.nID << m_task.net_msg.filename << m_task.net_msg.totalSize;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
m_task.tcpSocket->waitForConnected(5000);
int t = (int)m_task.tcpSocket->state();
m_task.tcpSocket->write(block);
}

/* 将处理结果发给客户端程序 */
void CHandleTask::sendResult(){}


此为服务器端中的一部分 主要实现从客户端接受文件 然后处理文件 再将结果发回客户端。
由于要采用多线程来实现多个客户端的同时传输,所以将这对文件的传输处理放在线程类中实现。现在如果不向客户端些数据是可以实现文件的接收的 即文件传输没问题但是向客户端写数据就有问题
其中部分变量函数未实现 在run中调用sendMsg函数(向客户端说明服务器准备好 可以传输文件了),通过调试发现能一直运行到m_task.tcpSocket->write(block);
但是通过观察端口发现并没有数据传出 客户端也收不到数据 到底怎么回事啊
...全文
515 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
largep 2012-05-21
  • 打赏
  • 举报
回复
你的socket这样写好乱啊。
你这是服务端?要使用QTcpServer。
ewerwerwerer 2012-05-18
  • 打赏
  • 举报
回复
上面run中的部分代码和sendMsg一样 是我准备调试改的 忘了删除

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧