Qt TCP网络通信学习

TCP简介:

Transmission Control Protocol,传输控制协议 。用于数据传输的低层网络协议,多个物联网协议都是基于TCP协议的。它是一个面向数据流和连接的可靠传输协议。

TCP头部格式:

QTcpSocket类为TCP提供了一个接口,继承自QAbstractSocket。可实现POP3、SMTP、NNTP等标准的网络协议,也可以实现自定义的网络协议。异步工作,依靠事件循环来检测到来的数据,并且自动刷新输出的数据。而QAbstractSocket继承自QIODevice,故该类具备文件的读写功能,可以使用QTextStream和QDataStream。

QHostAddress QAbstractSocket::peerAddress () const  获取主机的IP地址

quint16 QAbstractSocket::peerPort () const  获取主机的端口号

qint64 QIODevice::write ( const QByteArray & byteArray )  //写入数据,即通过TCP发送数据。

QByteArray QIODevice::read ( qint64 maxSize )   //读取数据,最多读取maxSize。即获取TCP接收的存放在缓冲区的数据

QByteArray QIODevice::readAll ()  //获取TCP存放在缓冲区可读取的所有数据。

从一个QTcpSocket中读取数据前,必须先调用qint64 QIODevice::bytesAvailable () const 函数来确保已经有足够的数据可用。

涉及到的信号:

void QAbstractSocket::connected () [signal]  当连接建立成功发射连接信号,指示一个已建立的新连接。

void QAbstractSocket::error ( QAbstractSocket::SocketError socketError ) [signal]  连接发生了错误,就会发送error()信号,参数指示发生了什么错误。

void QAbstractSocket::disconnected () [signal]  断开一个已经存在的连接时,发射断开信号。

void QAbstractSocket::stateChanged ( QAbstractSocket::SocketState socketState ) [signal]  状态改变都会发射stateChanged()信号。

void QIODevice::bytesWritten ( qint64 bytes ) [signal]  表示数据写入完成,对应的可以调用bytesToWrite()方法了解写入了多少字节的数据。

void QIODevice::readyRead () [signal]  表示有数据可以读取,对应的可以调用bytesAvailable()方法了解可以读取多少字节的数据。

一个简单的TCP客户端和服务端程序,单连接。

客户端程序:

#ifndef QTTCPCLIENT_H
#define QTTCPCLIENT_H
 
#include <QObject>
#include <QAbstractSocket>
 
class QTcpSocket; //前置声明
 
//客户端程序  单连接,即一个客户端一个服务端
class QtTcpClient : public QObject
{
    Q_OBJECT
public:
    explicit QtTcpClient(QObject *parent = 0);
    ~QtTcpClient();
 
    void sendMessage(); //发送信息
 
private slots:
    void readMessage();  //获取返回的信息
    void displayError(QAbstractSocket::SocketError);  //获取连接发生的错误
 
 
private:
 
    QTcpSocket *tcpSocket;  //tcp连接
 
    quint16 blockSize;  //发送数据的大小
};
 
#endif // QTTCPCLIENT_H

#include "qttcpclient.h"
#include <QtNetwork>
#include <QDataStream>
#include <QString>
#include <QByteArray>
#include <QIODevice>
#include <QObject>
#include <QDebug>
 
QtTcpClient::QtTcpClient(QObject *parent) :
    QObject(parent)
{
    tcpSocket=new QTcpSocket(this);
    //建立信号连接,readyRead表示有数据过来,需要读取
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessage()));
    //建立信号连接,error(QAbstractSocket::SocketError)连接发生错误或关闭时会发射此信号
    connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));
 
    blockSize=0;
    tcpSocket->abort();//终止已有的连接
 
    tcpSocket->connectToHost(QHostAddress(QString("127.0.0.1")),6666);//建立新的连接
 
    qDebug()<<"client run......"<<endl;
}
 
QtTcpClient::~QtTcpClient()
{
    delete tcpSocket;
    tcpSocket=NULL;
}
 
void QtTcpClient::sendMessage()
{
    QByteArray block;
    QDataStream out(&block,QIODevice::WriteOnly);
 
    out.setVersion(QDataStream::Qt_4_0);
    out<<(quint16)0;
    out<<QString("hi server this is my first connect!!!");
    out.device()->seek(0);//定位到数据的开头
    out<<(quint16)(block.size()-sizeof(quint16)); //添加数据大小信息到数据开头
 
    tcpSocket->write(block); //发送数据
 
}
 
void QtTcpClient::readMessage()
{
    QString message;
    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_4_0);
 
    if(blockSize==0)
    {
        //判断接收的数据是否大于两字节,也就是文件的大小信息所占的空间
        //如果是则保存到blockSize中,否则直接返回,继续接收数据。
        if(tcpSocket->bytesAvailable()<(int)sizeof(quint16))
        {
            return;
        }
 
        in>>blockSize;
    }
    //如果没有接收完全部数据,则返回继续接收
    if(tcpSocket->bytesAvailable()<blockSize)
    {
        return;
    }
    //将接收的数据存放到变量中
    in>>message;
 
    qDebug()<<message;
 
    this->sendMessage();
 
    //断开连接
    tcpSocket->disconnectFromHost();
}
 
void QtTcpClient::displayError(QAbstractSocket::SocketError)
{
    switch(tcpSocket->error())
    {
    case QAbstractSocket::RemoteHostClosedError:  //远程服务端关闭连接错误
        tcpSocket->disconnectFromHost();
        qDebug()<<"client close now";
        break;
    default:
        qDebug()<<"error id: "<<tcpSocket->error()<<endl;
        qDebug()<<"error message: "<<tcpSocket->errorString()<<endl;
        break;
    }
}

 
#include <QCoreApplication>
#include "qttcpclient.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    QtTcpClient tcpclient_t;
    
    return a.exec();
}

服务端程序:

#ifndef QTTCPSERVER_H
#define QTTCPSERVER_H
 
#include <QObject>
#include <QAbstractSocket>
 
class QTcpServer; //前置声明
class QTcpSocket;
 
//服务端程序  单连接,即一个客户端一个服务端
class QtTcpServer : public QObject
{
    Q_OBJECT
public:
    explicit QtTcpServer(QObject *parent = 0);
    ~QtTcpServer();
 
private slots:
    void sendMessage();//发送信息
    void readMessage();//获取返回的信息
    void displayError(QAbstractSocket::SocketError);//获取连接发生的错误
 
private:
    QTcpServer *tcpServer; //tcp服务端
 
    QTcpSocket *clientConnect;//来自客户端的连接
    quint16 blockSize;  //接收数据的大小
};
 
#endif // QTTCPSERVER_H
 
 
#include "qttcpserver.h"
#include <QtNetwork>
#include <QDataStream>
#include <QString>
#include <QByteArray>
#include <QIODevice>
#include <QObject>
#include <QDebug>
 
QtTcpServer::QtTcpServer(QObject *parent) :
    QObject(parent)
{
    blockSize=0;
    tcpServer=new QTcpServer(this);
 
    //开始监听
    if(!tcpServer->listen(QHostAddress(QString("127.0.0.1")),6666))
    {
        qDebug()<<tcpServer->serverError()<<endl;
        qDebug()<<tcpServer->errorString()<<endl;
        qApp->exit();
    }
    //建立信号连接,每来一个新的连接,就发送服务端信息
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendMessage()));
 
    qDebug()<<"server run....."<<endl;
}
 
QtTcpServer::~QtTcpServer()
{
    delete tcpServer;
    tcpServer=NULL;
 
    delete clientConnect;
    clientConnect=NULL;
}
 
void QtTcpServer::sendMessage()
{
    QByteArray block;
    QDataStream out(&block,QIODevice::WriteOnly);
 
    out.setVersion(QDataStream::Qt_4_0);
    out<<(quint16)0;
    out<<QString("hello client the connect build!!!");
    out.device()->seek(0);
    out<<(quint16)(block.size()-sizeof(quint16));
 
    clientConnect=tcpServer->nextPendingConnection();//获取客户端的连接
    tcpServer->close();
 
    //关联套接字的disconnected()和deleteLater(),表明当连接断开时删除该套接字
    connect(clientConnect,SIGNAL(disconnected()),clientConnect,SLOT(deleteLater()));
 
    clientConnect->write(block);
 
    connect(clientConnect,SIGNAL(readyRead()),this,SLOT(readMessage()));
    connect(clientConnect,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));
 
}
 
void QtTcpServer::readMessage()
{
    QString message;
    QDataStream in(clientConnect);
    in.setVersion(QDataStream::Qt_4_0);
 
    if(blockSize==0)
    {
        if(clientConnect->bytesAvailable()<(int)sizeof(quint16))
        {
            return;
        }
 
        in>>blockSize;
    }
 
    if(clientConnect->bytesAvailable()<blockSize)
    {
        return;
    }
 
    in>>message;
 
    qDebug()<<message;
 
}
 
void QtTcpServer::displayError(QAbstractSocket::SocketError)
{
    switch(clientConnect->error())
    {
    case QAbstractSocket::RemoteHostClosedError:
        clientConnect->disconnectFromHost(); //disconnectFromHost函数会一直等待套接字将所有数据发送完毕,然后关闭该套接字,并发射disconnected信号
        qDebug()<<"server connect close"<<endl;
        break;
    default:
        qDebug()<<"error id: "<<clientConnect->error()<<endl;
        qDebug()<<"error message: "<<clientConnect->errorString()<<endl;
        clientConnect->disconnectFromHost();
        qDebug()<<"server connect close"<<endl;
        break;
    }
}
 
#include <QCoreApplication>
#include "qttcpserver.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    QtTcpServer tcpserver_t;
    
    return a.exec();
}

运行结果:

基于TCP的文件传输程序:

客户端程序:

#ifndef CLIENT_H
#define CLIENT_H
#include <QAbstractSocket>
#include <QDialog>
#include <QFile>
#include <QTcpSocket>
#include <QString>
#include <QByteArray>
 
namespace Ui {
class Client;
}
 
class Client : public QDialog
{
    Q_OBJECT
    
public:
    explicit Client(QWidget *parent = 0);
    ~Client();
 
private slots:
    void openFile();
    void send();
    void startTransfer();
    void updateClientProgress(qint64);
    void displayError(QAbstractSocket::SocketError);
    
    void on_pushButton_open_clicked();
    void on_pushButton_send_clicked();
 
private:
    Ui::Client *ui;
 
    QTcpSocket *tcpClient; //tcp连接
    QFile *localFile;      //要发送的文件
    qint64 totalBytes;     //发送数据的总大小
    qint64 bytesWritten;   //已经发送的数据大小
    qint64 bytesToWrite;   //剩余的数据大小
    qint64 payloadSize;    //每次发送数据的大小
    QString fileName;      //保存文件路径
    QByteArray outBlock;   //数据缓冲区,即存放每次要发送的数据块
};
 
#endif // CLIENT_H
 
 
#include "client.h"
#include "ui_client.h"
#include <QtNetwork>
#include <QFileDialog>
#include <QDebug>
 
Client::Client(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);
 
    //初始化变量
    this->payloadSize=64*1024;   //64KB,每次发送的数据块大小为64KB
    this->totalBytes=0;
    this->bytesWritten=0;
    this->bytesToWrite=0;
 
    this->tcpClient=new QTcpSocket(this);
 
    //当连接服务器成功时,发送connected()信号,开始传送文件
    connect(this->tcpClient,SIGNAL(connected()),this,SLOT(startTransfer()));
    //每次发送成功后发送bytesWritten(qint64))信号,告诉已成功发送的数据块大小,并更新进度条
    connect(this->tcpClient,SIGNAL(bytesWritten(qint64)),this,SLOT(updateClientProgress(qint64)));
    //接收tcp连接发生的错误
    connect(this->tcpClient,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));
 
    ui->pushButton_send->setEnabled(false);
}
 
Client::~Client()
{
    delete ui;
}
 
void Client::openFile()
{
    this->fileName=QFileDialog::getOpenFileName(this);
    if(!this->fileName.isEmpty())
    {
        ui->pushButton_send->setEnabled(true);
        ui->label_state->setText(QString("打开文件 %1 成功").arg(this->fileName));
    }
}
 
void Client::send()
{
    ui->pushButton_send->setEnabled(false);
 
    this->bytesWritten=0;
    ui->label_state->setText(QString("连接中..."));
    //连接服务器
    this->tcpClient->connectToHost(ui->lineEdit_host->text(),ui->lineEdit_port->text().toInt());
}
 
void Client::startTransfer()
{
    this->localFile=new QFile(this->fileName);
    //打开文件
    if(!this->localFile->open(QFile::ReadOnly))
    {
        qDebug()<<"client: open file error!"<<endl;
        return;
    }
 
    //获取打开文件的大小
    this->totalBytes=this->localFile->size();
 
    QDataStream sendOut(&this->outBlock,QIODevice::WriteOnly);
    sendOut.setVersion(QDataStream::Qt_4_0);
    //获取文件名(去掉文件前面的路径)
    QString currentFileName=this->fileName.right(this->fileName.size()-this->fileName.lastIndexOf('/')-1);
    //保留总大小信息空间,文件名大小信息空间,然后输入文件名
    sendOut<<qint64(0)<<qint64(0)<<currentFileName;
    //总大小变量为总大小信息、文件名大小信息、文件名和实际文件大小的总和
    this->totalBytes+=this->outBlock.size();
    //返回outBlock的开始,填入总大小信息
    sendOut.device()->seek(0);
    //填入各个项的大小信息以及文件名
    sendOut<<this->totalBytes<<qint64(this->outBlock.size()-sizeof(qint64)*2);
    //发送完文件头结构后剩余数据的大小
    this->bytesToWrite=this->totalBytes-this->tcpClient->write(this->outBlock);
 
    ui->label_state->setText(QString("已连接"));
    this->outBlock.resize(0);
}
 
void Client::updateClientProgress(qint64 numBytes)
{
    //更新已经发送数据的大小
    this->bytesWritten+=(int)numBytes;
    //如果已经发送了数据
    if(this->bytesToWrite>0)
    {
        //每次发送payloadSize大小的数据,不足就发送剩余数据大小
        this->outBlock=this->localFile->read(qMin(this->bytesToWrite,this->payloadSize));
        //发送完一次数据后还剩余数据的大小
        this->bytesToWrite-=(int)this->tcpClient->write(this->outBlock);
        //清空发送缓冲区
        this->outBlock.resize(0);
    }
    else
    {
        //如果没有发送任何数据,就关闭文件
        this->localFile->close();
    }
 
    //更新进度条
    ui->progressBar->setMaximum(this->totalBytes);
    ui->progressBar->setValue(this->bytesWritten);
 
    //发送完毕
    if(this->bytesWritten==this->totalBytes)
    {
        ui->label_state->setText(QString("传送文件 %1 成功").arg(this->fileName));
        this->localFile->close(); //关闭文件
        this->tcpClient->close(); //关闭tcp连接
    }
}
 
void Client::displayError(QAbstractSocket::SocketError)
{
    qDebug()<<this->tcpClient->errorString()<<endl;
    this->tcpClient->close();
    ui->progressBar->reset();
    ui->label_state->setText(QString("客户端已就绪!"));
    ui->pushButton_send->setEnabled(true);
}
 
void Client::on_pushButton_open_clicked()
{
    ui->progressBar->reset();
    ui->label_state->setText(QString("状态:等待文件打开!"));
    this->openFile();
}
 
void Client::on_pushButton_send_clicked()
{
    this->send();
}
 
 
#include <QApplication>
#include "client.h"
#include <QTextCodec>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
 
    Client w;
    w.show();
    
    return a.exec();
}

服务器程序:

#ifndef SERVER_H
#define SERVER_H
 
#include <QDialog>
#include <QFile>
#include <QTcpSocket>
#include <QTcpServer>
#include <QAbstractSocket>
#include <QString>
#include <QByteArray>
 
namespace Ui {
class Server;
}
 
class Server : public QDialog
{
    Q_OBJECT
    
public:
    explicit Server(QWidget *parent = 0);
    ~Server();
 
private slots:
    void start();
    void acceptConnection();
    void updateServerProgress();
    void displayError(QAbstractSocket::SocketError socketError);
 
    void on_pushButton_clicked();
 
private:
    Ui::Server *ui;
 
    QTcpServer tcpServer; //服务器监听
    QTcpSocket *tcpServerConnection; //来自客户端的连接
 
    qint64 totalBytes;  //存放总大小信息
    qint64 bytesReceived; //已收到的数据大小
    qint64 fileNameSize; //存放文件名的大小信息
 
    QString fileName;  //存放文件名
    QFile *localFile;  //本地文件
    QByteArray inBlock;  //数据缓冲区
};
 
#endif // SERVER_H
 
#include "server.h"
#include "ui_server.h"
#include <QtNetwork>
#include <QDebug>
 
Server::Server(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Server)
{
    ui->setupUi(this);
    //有新的连接到来,发射newConnection()信号,获取新的连接
    connect(&this->tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
}
 
Server::~Server()
{
    delete ui;
}
 
void Server::start()
{
    //建立监听
    if(!this->tcpServer.listen(QHostAddress(QString("127.0.0.1")),6666))
    {
        qDebug()<<this->tcpServer.errorString()<<endl;
        close();
        return;
    }
 
    ui->pushButton->setEnabled(false);
    //初始化变量
    this->totalBytes=0;
    this->bytesReceived=0;
    this->fileNameSize=0;
 
    ui->label->setText(QString("监听"));
    ui->progressBar->reset();
}
 
void Server::acceptConnection()
{
    //获取来自客户端的连接
    this->tcpServerConnection=this->tcpServer.nextPendingConnection();
    //建立信号连接
    connect(this->tcpServerConnection,SIGNAL(readyRead()),this,SLOT(updateServerProgress()));
    connect(this->tcpServerConnection,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));
 
    ui->label->setText(QString("接收连接"));
 
    this->tcpServer.close();
}
 
void Server::updateServerProgress()
{
    QDataStream in(this->tcpServerConnection);
    in.setVersion(QDataStream::Qt_4_0);
    //如果接收到的数据小于16个字节,保存到来的文件头结构
    if(this->bytesReceived<=sizeof(qint64)*2)
    {
        if((this->tcpServerConnection->bytesAvailable()>=sizeof(qint64)*2)&&(this->fileNameSize==0))
        {
            //接收数据总大小信息和文件名大小信息
            in>>this->totalBytes>>this->fileNameSize;
            this->bytesReceived+=sizeof(qint64)*2;
        }
 
        if((this->tcpServerConnection->bytesAvailable()>=this->fileNameSize)&&(this->fileNameSize!=0))
        {
            //接收文件名,并建立文件
            in>>this->fileName;
            ui->label->setText(QString("接收文件 %1 ......").arg(this->fileName));
            this->bytesReceived+=this->fileNameSize;
            this->localFile=new QFile(this->fileName);
            if(!this->localFile->open(QFile::WriteOnly))
            {
                qDebug()<<"server: open file error"<<endl;
                return;
            }
        }
        else
        {
            return;
        }
    }
    //开始接收文件里面的数据
    if(this->bytesReceived<this->totalBytes)
    {
        this->bytesReceived+=this->tcpServerConnection->bytesAvailable();
        this->inBlock=this->tcpServerConnection->readAll();
        this->localFile->write(this->inBlock);
        this->inBlock.resize(0);
     }
 
    ui->progressBar->setMaximum(this->totalBytes);
    ui->progressBar->setValue(this->bytesReceived);
    //接收数据完成时
    if(this->bytesReceived==this->totalBytes)
    {
        this->tcpServerConnection->close();
        this->localFile->close();
        ui->pushButton->setEnabled(true);
        ui->label->setText(QString("接收文件 %1 成功").arg(this->fileName));
    }
}
 
void Server::displayError(QAbstractSocket::SocketError socketError)
{
    qDebug()<<this->tcpServerConnection->errorString();
    this->tcpServerConnection->close();
    ui->progressBar->reset();
    ui->label->setText(QString("服务端就绪"));
    ui->pushButton->setEnabled(true);
}
 
void Server::on_pushButton_clicked()
{
    start();
}
 
 
#include <QApplication>
#include "server.h"
#include <QTextCodec>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
 
    Server w;
    w.show();
    
    return a.exec();
}

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Qt网络编程实现TCP通信

    Qt网络编程实现TCP通信,供大家参考,具体内容如下 标签(空格分隔): Tcp通信 一.Tcp简介 (1)TCP(Transmission Control Protocol,传输控制协议)TCP是一个用于数据传输的传输层网络协议,多个网络协议包括(HTTP和FTP都是基于TCP协议),TCP是面向数据流和连接的可靠的传输协议,它区别于传输层的另外一个协议UDP(具体可看—Qt简单实现UDP通信) . (2)QTcpSocket继承自QAbstractSocket,与QUdpSocket传输的数

  • QT编写tcp通信工具(Server端)

    本文实例为大家分享了QT编写Server端的tcp通信工具的具体代码,供大家参考,具体内容如下 1.说明 使用qt写一个类似网上常见的网络调试工具.此篇为Server端.Client端在上一篇. 2.基本流程 新建QTcpServer对象,为其newConnection信号写槽函数.此为新的Client连接信号,在其对应槽函数里使用nextPendingConnection方法获取Client对象,并为Client添加readyRead(读数据),disconnected(断开连接)两个信号写槽

  • QT网络通信TCP客户端实现详解

    本文实例为大家分享了QT网络通信TCP客户端实现的具体代码,供大家参考,具体内容如下 QT中基于TCP套接字的网络通信需要用到两个类 QTcpServer:服务器类,用于监听客户端连接和客户端建立连接 QTcpSocket:通信套接字类,客户端和服务端都需要使用* 这两个类都属于网络通信的network需要在工程路径下添加network QT += core gui network 服务器 mainwindow.cpp #include "mainwindow.h" #include

  • QT网络编程Tcp下C/S架构的即时通信实例

    先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include <QDialog> #include <QListWidget> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QGridLayout> #include <QtNetWo

  • QT5实现简单的TCP通信的实现

    目录 一.客户端 二.服务器 三.运行结果 这段时间用到了QT的TCP通信,做了初步的学习与尝试,编写了一个客户端和服务器基于窗口通信的小例程. 使用QT的网络套接字需要.pro文件中加入一句: QT += network 一.客户端 1.客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步: (1)创建QTcpSocket套接字对象 socket = new QTcpSocket(); (2)使用这个对象连接服务器 socket->connec

  • QT编写tcp通信工具(Client篇)

    本文实例为大家分享了QT编写tcp通信工具的具体实现代码,Client篇,供大家参考,具体内容如下 1.说明 使用qt写一个类似网上常见的网络调试工具.此篇为Client端.下一遍再写Server端. 2.基本流程 Client端相对简单:创建QTcpSocket对象,为对象的readyRead,error,connected(可选)分别写槽函数,以处理读数据,错误,连接成功三个事件. 连接使用对象的connectToHost方法,断开使用disconnectFromHost方法. 程序不做编码

  • 基于QT的TCP通信服务的实现

    目录 一.结构 1.1 套接字 1.2 socket通信流程 1.3 QTcpsocket 1.4 QTcpServer 二.设计UI 2.1 客户端UI 2.2 服务器端UI 三.核心代码 四.效果图 一.结构 1.1 套接字 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字

  • Qt TCP网络通信学习

    TCP简介: Transmission Control Protocol,传输控制协议 .用于数据传输的低层网络协议,多个物联网协议都是基于TCP协议的.它是一个面向数据流和连接的可靠传输协议. TCP头部格式: QTcpSocket类为TCP提供了一个接口,继承自QAbstractSocket.可实现POP3.SMTP.NNTP等标准的网络协议,也可以实现自定义的网络协议.异步工作,依靠事件循环来检测到来的数据,并且自动刷新输出的数据.而QAbstractSocket继承自QIODevice,

  • QT TCP实现简单的通信示例

    本文实例为大家分享了QT TCP实现简单通信示例的具体代码,供大家参考,具体内容如下 TCP服务端: 第一步: 创建监听套接字的QTcpSever QTcpServer *m_tsTcpServer; 第二步: listen------监听是否有新的连接进来 int iMyport;如果有新的客户端连接的话,会触发信号newConnection(),定义一个槽函数接收连接好的套接字. //监听的端口号 iMyport = iPort; //判断是否接收到了新的连接 if(m_tsTcpServe

  • 基于java TCP网络通信的实例详解

    JAVA中设计网络编程模式的主要有TCP和UDP两种,TCP是属于即时通信,UDP是通过数据包来进行通信,UDP当中就会牵扯到数据的解析和传送.在安全性能方面,TCP要略胜一筹,通信过程中不容易出现数据丢失的现象,有一方中断,两方的通信就会结束,UDP数据包传送的过程当中,一方中断,数据包有很大的可能丢失,还有可能传来的数据包的顺序是错乱的:在效率方面,UDP要比TCP快的不只是一点点的问题,若终端有解析数据方法的函数,数据包就会源源不断的传送过来,然后反馈回去.以上都是我自己的理解,下面是关于

  • Qt基于TCP实现客户端与服务端的连接

    Qt TCP的客户端与服务端的连接,供大家参考,具体内容如下 可以实现局域网内简单的信息传递(文件传输,稍后更新) 界面是用ui设计师做的简单设计 客户端 (1).ClientWidget.h 头文件 #ifndef CLIENTWIDGET_H #define CLIENTWIDGET_H #include <QWidget> #include "ui_ClientWidget.h" #include <QTcpSocket> #include <QHo

  • C/C++后端学习与练习深入

    目录 一.算法训练 1.拓扑顺序 2.功夫传人 3.二叉树中的最低公共祖先 二.工程项目训练 day1.Qt(串口的使用) 三.总结 一.算法训练 首先给大家带来校招程序员考察的核心技能训练:算法,不管你用什么语言, 数据结构与算法一定是最核心的基本功.说得实际和功利一点, 算法是你进入大厂的敲门砖,还能帮你在工作中快速地弯道超车, 所以一定得搞懂哦~~~ 另外现在现在大厂的笔试很多采用ACM模式,面试手撕代码则多为力扣模式 (核心代码模式)今天给大家带来中大厂笔试训练 1.拓扑顺序 这是 20

  • C#异步编程详解

    前言 本节主要介绍异步编程中Task.Async和Await的基础知识. 什么是异步? 异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程. 异步和多线程 相同点:避免调用线程阻塞,从而提高软件的可响应性. 不同点: 异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不用,最起码可以减少 共享变量的数量),减少了死锁的可能.C#5.0 .NET4.5 以后关键字Async和Awai

  • Java实现带图形界面的聊天程序

    本文实例为大家分享了vue + element ui实现锚点定位的具体代码,供大家参考,具体内容如下 ServerDemo01.java import javax.swing.*; import javax.swing.border.Border; import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.I

  • 详解Android客户端与服务器交互方式

    最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json.要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台.传输数据格式标准.交互方便. 为了与服务器通讯其实无非就两种协议HTTP和TCP,TCP的学习Socket,HTTP的话熟悉一下HTTP协议和相关Java API.而下面的几种方式就是从这两种协议扩展出来的:webservices soap.SSH的JSON(可参考:该链接

  • PyQt5+Caffe+Opencv搭建人脸识别登录界面

    最近开始学习Qt,结合之前学习过的caffe一起搭建了一个人脸识别登录系统的程序,新手可能有理解不到位的情况,还请大家多多指教. 我的想法是用opencv自带的人脸检测算法检测出面部,利用caffe训练好的卷积神经网络来提取特征,通过计算当前检测到的人脸与已近注册的所有用户的面部特征之间的相似度,如果最大的相似度大于一个阈值,就可以确定当前检测到的人脸对应为这个相似度最大的用户了. ###Caffe人脸识别 因为不断有新的用户加入,然而添加新用户后重新调整CNN的网络结构太费时间,所以不能用CN

随机推荐