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을 감청하여 약속된 문자열 파일을 받을 때마다 파일 이름을 분석하고 파일 내용을 발송합니다.프로젝트의 프로 파일에 네트워크 모듈을 추가하는 것을 잊지 마세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Qt로 문자와 이미지의 혼합 텍스트 그리기
텍스트를 그리려면 QPainter::drawText 함수를 사용하지만 텍스트와 동시에 이미지 (아이콘 등)를 함께 그리기를 원합니다.
QLabel와 QPushButton는 이미지와 텍스트를 표시하는 기능을 가지고 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
전체 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을 감청하여 약속된 문자열 파일을 받을 때마다 파일 이름을 분석하고 파일 내용을 발송합니다.프로젝트의 프로 파일에 네트워크 모듈을 추가하는 것을 잊지 마세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Qt로 문자와 이미지의 혼합 텍스트 그리기
텍스트를 그리려면 QPainter::drawText 함수를 사용하지만 텍스트와 동시에 이미지 (아이콘 등)를 함께 그리기를 원합니다.
QLabel와 QPushButton는 이미지와 텍스트를 표시하는 기능을 가지고 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Qt로 문자와 이미지의 혼합 텍스트 그리기텍스트를 그리려면 QPainter::drawText 함수를 사용하지만 텍스트와 동시에 이미지 (아이콘 등)를 함께 그리기를 원합니다. QLabel와 QPushButton는 이미지와 텍스트를 표시하는 기능을 가지고 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.