Qt TCP 파일 서버 구현(서버 전송 파일)

3440 단어 Qt

약술


TCP 파일 서버의 실현은 TCP 서버를 바탕으로 파일 전송 논리를 증가시킬 수 있다.TCP 파일 서버 구현을 참조하십시오.【https://blog.csdn.net/lusanshui/article/details/88565806 】

코드의 길


전체 TCP 파일 서버 코드를 직접 제공합니다.MyFileServer 클래스의 헤더 파일은 다음과 같습니다.
#include 
#include 
#include 
#include 
#include 
#include 
#include 

class MyFileServer : public QObject
{
	Q_OBJECT
public:
	MyFileServer(QObject *parent = 0);
	~MyFileServer();
signals:
	void startSendFile(QString filename);
private slots:
	void acceptFileConnection();
	void updateFileProgress();
	void displayError(QAbstractSocket::SocketError socketError);
	void filesocketDisconnect();
	void sendFile(QString filename);
private:
	QString getFileFullPath(QString tmp); //          
private:
	QTcpServer *fileserver;
	QTcpSocket *filesocket;
	QThread *m_thread;
	
	MyDatastream m_DATAstream;
	SingleFile m_SingleFile;	
}

MyFileServer 클래스의 소스 파일은 다음과 같습니다.
MyFileServer::MyFileServer(QObject *parent) : QObject(parent)
{
	m_thread = new QThread();
	filesocket = new QTcpSocket();
	fileserver = new QTcpServer();
	//listening
	fileserver->listen(QHostAddress::Any, 6001);
	connect(fileserver, SIGNAL(newConnection()), this, SLOT(acceptFileConnection()));
	filesocket->moveToThread(m_thread);
	fileserver->moveToThread(m_thread);
	this->moveToThread(m_thread);
	m_thread->start();
}

MyFileServer::~MyFileServer()
{
	m_thread->quit();
	m_thread->wait();
	delete m_thread;
	filesocket->close();
	delete filesocket;
	fileserver->close();
	delete fileserver;
}

void MyFileServer::acceptFileConnection()
{
	filesocket = fileserver->nextPendingConnection();
	connect(filesocket, SIGNAL(readyRead()), this, SLOT(updateFileProgress()));
	connect(filesocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
	connect(filesocket, SIGNAL(disconnected()), this, SLOT(filesocketDisconnect()));
	connect(this, SIGNAL(startSendFile(QString)), this, SLOT(sendFile(QString)));
}

void MyFileServer::updateFileProgress()
{
	//receive msg
	if (filesocket->bytesAvailable() <= 0)
	{
		return;
	}
	QByteArray singleBuffer = filesocket->readAll();
	if (singleBuffer.size() == 14 && singleBuffer[0] == 0xF7) //    
	{
		m_SingleFile = m_DATAstream.ReadSingleFile(singleBuffer); //      ,        
		QString tmpFilename = m_SingleFile.fileDataInfo.strName;
		QString tmpFullFilename = getFileFullPath(tmpFilename); //          
		emit startSendFile(tmpFullFilename);
	}
}

void MyFileServer::displayError(QAbstractSocket::SocketError socketError)
{
	qDebug() << filesocket->errorString();
	filesocket->close();
}

void MyFileServer::filesocketDisconnect()
{
	filesocket->deleteLater();
}

void MyFileServer::sendFile(QString filename)
{
	QFile localFile(filename);
	if (!localFile.open(QFile::ReadOnly))
	{
		qDebug() << "cannot open file which need to send!";
		return;
	}
	QByteArray  totalba = localFile.readAll();
	filesocket->write(totalba);
}

QString MyFileServer::getFileFullPath(QString tmp)
{
	QString fullpath;
	//...
	return fullpath;
}

총결산


이 글은 포트 번호 6001을 감청하여 약속된 문자열 파일을 받을 때마다 파일 이름을 분석하고 파일 내용을 발송합니다.프로젝트의 프로 파일에 네트워크 모듈을 추가하는 것을 잊지 마세요.

좋은 웹페이지 즐겨찾기