基于QT的TCP通信实现(TCPServer和TCPClient)

7 篇文章 0 订阅
订阅专栏
3 篇文章 0 订阅
订阅专栏
1 篇文章 0 订阅
订阅专栏


近期因为测试需要用到 TCPServer(TCP服务端)TCPClient(TCP客户端)来进行通信和数据的发送以及接受,所以用QT分别写了TCP服务端和TCP客户端,本文分享以下基于QT开发TCPServer和TCPClient的经验, 文中包括源码,在文末处包含项目的源码文件

一、软件介绍

TCPServer可以绑定一个ip地址并监听一个端口,在TCPServer绑定并监听状态时,可以使用TCPClient来连接服务端绑定的ip地址和端口,连接成功后便可进行通信了。下面首先演示以下服务端和客户端界面以及通信流程。

1.1 TCPServer服务端界面

  • 在服务端的界面中,“开始监听”按钮可以在设置“监听地址”、“监听端口”后点击既开始对此ip地址和端口进行监听,当有TCPClient客户端针对此ip地址和端口进行请求连接时便可进行连接,随后开始通信。
  • “停止监听”可以停止对ip地址和端口号的监听。
  • “清空文本框”按钮可以清空消息记录,方便连续信息的阅读。
  • “退出”按钮即关闭此软件。
  • “发送消息”可发送已经输入的内容。
    在这里插入图片描述

1.2 TCPClient客户端界面

  • 在客户端的界面中,“连接”按钮可以在设置“连接地址”、“端口”后点击既开始对此ip地址和端口进行请求连接,当有TCPServer服务端针对此ip地址和端口进行监听时便可进行连接,随后开始通信。
  • “断开连接”可以讲服务端和客户端已经建立的连接断开。
  • “清空文本框”按钮可以清空消息记录,方便连续信息的阅读。
  • “发送消息”和“清除”按钮分别可发送和清除已经输入的内容。
  • “退出”按钮即关闭此软件。
    在这里插入图片描述

1.3 服务端和客户端建立连接并通信演示

  • 首先在Server端我们绑定ip:192.168.31.222,端口:1200,然后点击“开始监听”按钮,这时服务端就开始等待Client端请求建立连接。
    在这里插入图片描述
  • 接下来我们使用客户端,连接地址和端口号设置为服务端所绑定的ip:192.168.31.222,端口:1200,然后点击“连接”按钮,可以看到双方建立连接成功,软件出现连接成功建立提示信息。
    在这里插入图片描述
  • 双方建立连接成功便可以开始通信,我们首先点击“清空文本框”把提示信息清除,然后使用TCPServer服务端发送一条信息“Hello,I’m TCPServer~”,可以看到客户端成功收到服务端发送的信息,[in]后边的内容为本端收到的信息,[out]后边的内容为本端发送的信息。
    在这里插入图片描述
  • 接下来我们使用TCPClient客户端给服务端发送一条信息“Hi,I’m TCPClient!”,可以看到服务端成功收到信息。
    在这里插入图片描述

二、QT实现TCPServer和TCPClient

我们想要在QT中实现TCP通信需要在.pro文件中添加下面一行代码:

QT       += network

2.1 TCPClient客户端

  • 首先我们应该包含下面三个头文件来支持我们调用内部的通信函数:
#include <QTcpSocket>
#include <QHostAddress>
#include <QHostInfo>
  • 创建QTcpSocket套接字对象
tcpClient = new QTcpSocket(this);
  • 使用tcpClient 对象连接服务器
tcpClient ->connectToHost(IP, port);
  • 然后我们用write()函数向服务器发送数据
tcpClient ->write(data);
  • 当tcpClient 接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
connect(tcpClient,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));

void MainWindow::onSocketReadyRead()
{//readyRead()信号槽函数
    while(tcpClient->canReadLine())
        ui->plainTextEdit->appendPlainText("[in] "+tcpClient->readLine());
}
  • 在我们通信完毕后需要断开连接
void MainWindow::on_actDisconnect_triggered()
{//断开与服务器的连接
    if (tcpClient->state()==QAbstractSocket::ConnectedState)
        tcpClient->disconnectFromHost();
}

下面给出TCPClient的代码

  • main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QFile>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.resize(700,900);
    w.show();

    return a.exec();
}

  • mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpSocket>
#include <QLabel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QTcpSocket *tcpClient;  //socket
    QLabel *LabSocketState;  //状态栏显示标签

    QString getLocalIP();//获取本机IP地址
protected:
    void closeEvent(QCloseEvent *event);
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
//自定义槽函数
    void onConnected();
    void onDisconnected();
    void onSocketStateChange(QAbstractSocket::SocketState socketState);
    void onSocketReadyRead();//读取socket传入的数据

    void on_actConnect_triggered();
    void on_actDisconnect_triggered();
    void on_actClear_triggered();
    void on_btnSend_clicked();
    void on_btnClear_clicked();
    void on_actionTimeCurrent_triggered();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

  • mainwindow.cpp
#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QHostAddress>
#include <QHostInfo>
#include <QDateTime>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    tcpClient = new QTcpSocket(this); //创建socket变量

    LabSocketState = new QLabel("Socket状态:");//状态栏标签
    LabSocketState->setMinimumWidth(250);
    ui->statusBar->addWidget(LabSocketState);

    QString localIP=getLocalIP();//本机IP
    this->setWindowTitle("TCP客户端");
    ui->comboServer->addItem(localIP);

    setFocusPolicy(Qt::StrongFocus);
    installEventFilter(this); 

    connect(tcpClient,SIGNAL(connected()),this,SLOT(onConnected()));
    connect(tcpClient,SIGNAL(disconnected()),this,SLOT(onDisconnected()));

    connect(tcpClient,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    connect(tcpClient,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onConnected()
{ //connected()信号槽函数
    ui->plainTextEdit->appendPlainText("**已连接到服务器");
    ui->plainTextEdit->appendPlainText("**peer address:"+tcpClient->peerAddress().toString());
    ui->plainTextEdit->appendPlainText("**peer port:"+QString::number(tcpClient->peerPort()));
    ui->actConnect->setEnabled(false);
    ui->actDisconnect->setEnabled(true);
}

QString MainWindow::getLocalIP()
{
    QString hostName = QHostInfo::localHostName();//本地主机名
    QHostInfo hostInfo = QHostInfo::fromName(hostName);
    QString localIP = "";

    QList<QHostAddress> addList=hostInfo.addresses();

    if (!addList.isEmpty())
    for (int i=0;i<addList.count();i++)
    {
        QHostAddress aHost = addList.at(i);
        if (QAbstractSocket::IPv4Protocol == aHost.protocol())
        {
            localIP=aHost.toString();
            break;
        }
    }
    return localIP;
}
void MainWindow::closeEvent(QCloseEvent *event)
{
    if (tcpClient->state() == QAbstractSocket::ConnectedState)
        tcpClient->disconnectFromHost();
    event->accept();
}

void MainWindow::onDisconnected()
{//disConnected()信号槽函数
    ui->plainTextEdit->appendPlainText("**已断开与服务器的连接");
    ui->actConnect->setEnabled(true);
    ui->actDisconnect->setEnabled(false);
}

void MainWindow::onSocketReadyRead()
{//readyRead()信号槽函数
    while(tcpClient->canReadLine())
        ui->plainTextEdit->appendPlainText("[in] "+tcpClient->readLine());
}

void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)
{//stateChange()信号槽函数
    switch(socketState)
    {
    case QAbstractSocket::UnconnectedState:
        LabSocketState->setText("scoket状态:UnconnectedState");
        break;
    case QAbstractSocket::HostLookupState:
        LabSocketState->setText("scoket状态:HostLookupState");
        break;
    case QAbstractSocket::ConnectingState:
        LabSocketState->setText("scoket状态:ConnectingState");
        break;

    case QAbstractSocket::ConnectedState:
        LabSocketState->setText("scoket状态:ConnectedState");
        break;

    case QAbstractSocket::BoundState:
        LabSocketState->setText("scoket状态:BoundState");
        break;

    case QAbstractSocket::ClosingState:
        LabSocketState->setText("scoket状态:ClosingState");
        break;

    case QAbstractSocket::ListeningState:
        LabSocketState->setText("scoket状态:ListeningState");
    }
}

void MainWindow::on_actConnect_triggered()
{//连接到服务器
    QString addr=ui->comboServer->currentText();
    quint16 port=ui->spinPort->value();
    tcpClient->connectToHost(addr,port);
}

void MainWindow::on_actDisconnect_triggered()
{//断开与服务器的连接
    if (tcpClient->state()==QAbstractSocket::ConnectedState)
        tcpClient->disconnectFromHost();
}

void MainWindow::on_actClear_triggered()
{
    ui->plainTextEdit->clear();
}

void MainWindow::on_btnSend_clicked()
{//发送数据

    QString msg=ui->editMsg->toPlainText();
    ui->plainTextEdit->appendPlainText("[out] "+msg);

    ui->editMsg->setFocus();

    QByteArray str = msg.toLatin1();
    str.append("\r\n");
    tcpClient->write(str);
}

void MainWindow::on_btnClear_clicked()
{
    ui->editMsg->clear();
}

void MainWindow::on_actionTimeCurrent_triggered()
{
    QString msg=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
    ui->plainTextEdit->appendPlainText(+" [out] "+msg);

    ui->editMsg->setFocus();

    QByteArray str = msg.toLatin1();
    str.append("\r\n\r\n");
    tcpClient->write(str);
}

  • ui界面
    在这里插入图片描述

2.1 TCPServer服务端

  • 首先需要包含下面的头文件来提供我们需要调用的函数:
#include <QTcpServer>
#include <QtNetwork>
  • 然后创建TCPServer对象
tcpServer=new QTcpServer(this);
  • 绑定ip并监听端口功能,为客户端可以通过这个端口访问服务器
tcpServer->listen(addr,port);
  • 当tcpServer被tcpClient访问时,会发出newConnection()信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));

void MainWindow::onNewConnection()
{
    tcpSocket = tcpServer->nextPendingConnection(); //创建socket

    connect(tcpSocket, SIGNAL(connected()),this, SLOT(onClientConnected()));
    onClientConnected();
    connect(tcpSocket, SIGNAL(disconnected()),this, SLOT(onClientDisconnected()));
    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    onSocketStateChange(tcpSocket->state());
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
}
  • 使用tcpSocket的write()函数向客户端发送数据
tcpSocket->write(data);
  • 当tcpSocket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));

void MainWindow::onSocketReadyRead()
{
    while(tcpSocket->canReadLine()){
        ui->plainTextEdit->appendPlainText("[in] "+tcpSocket->readLine());
    }
}
  • 停止监听
void MainWindow::on_actStop_triggered()
{
    if (tcpServer->isListening()) //tcpServer正在监听
    {
        tcpServer->close();//停止监听
        ui->actStart->setEnabled(true);
        ui->actStop->setEnabled(false);
        LabListen->setText("监听状态:已停止监听");
    }
}

下面给出TCPServer的代码

  • main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.resize(600,700);
    w.show();

    return a.exec();
}

  • mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>
#include <QLabel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

protected:
    void closeEvent(QCloseEvent *event);//关闭窗口时停止监听

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void onNewConnection();//QTcpServer的newConnection()信号
    void onSocketStateChange(QAbstractSocket::SocketState socketState);//底部socket状态变化
    void onClientConnected(); //客户端接入时
    void onClientDisconnected();//客户端断开连接时
    void onSocketReadyRead();//读取socket传入的数据

    void on_actStart_triggered();//开始监听
    void on_actStop_triggered();//停止监听
    void on_actClear_triggered();//清空
    void on_btnSend_clicked();//发送消息
    void on_actHostInfo_triggered();//获取本机地址

private:
    Ui::MainWindow *ui;
    QLabel *LabListen;//状态栏标签
    QLabel *LabSocketState;//状态栏标签
    QTcpServer *tcpServer; //TCP服务器
    QTcpSocket *tcpSocket;//TCP通讯的Socket
    QString getLocalIP();//获取本机IP地址
};

#endif // MAINWINDOW_H

  • mainwindow.cpp
#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    LabListen=new QLabel("监听状态:");
    LabListen->setMinimumWidth(150);
    ui->statusBar->addWidget(LabListen);

    LabSocketState=new QLabel("Socket状态:");
    LabSocketState->setMinimumWidth(200);
    ui->statusBar->addWidget(LabSocketState);

    QString localIP=getLocalIP();//本机IP
    this->setWindowTitle(this->windowTitle()+"----本机IP:"+localIP);
    ui->comboIP->addItem(localIP);

    tcpServer=new QTcpServer(this);
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

QString MainWindow::getLocalIP()
{
    QString hostName=QHostInfo::localHostName();//本地主机名
    QHostInfo hostInfo=QHostInfo::fromName(hostName);
    QString localIP="";

    QList<QHostAddress> addList=hostInfo.addresses();

    if (!addList.isEmpty())
    for (int i=0;i<addList.count();i++)
    {
        QHostAddress aHost=addList.at(i);
        if (QAbstractSocket::IPv4Protocol==aHost.protocol())
        {
            localIP=aHost.toString();
            break;
        }
    }
    return localIP;
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    if (tcpServer->isListening())
        tcpServer->close();//停止网络监听
    event->accept();
}

void MainWindow::onNewConnection()
{
    tcpSocket = tcpServer->nextPendingConnection(); //创建socket

    connect(tcpSocket, SIGNAL(connected()),this, SLOT(onClientConnected()));
    onClientConnected();
    connect(tcpSocket, SIGNAL(disconnected()),this, SLOT(onClientDisconnected()));
    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
    onSocketStateChange(tcpSocket->state());
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
}

void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)
{
    qDebug()<<"走到这了";
    switch(socketState)
    {
    case QAbstractSocket::UnconnectedState:
        LabSocketState->setText("scoket状态:UnconnectedState");
        break;
    case QAbstractSocket::HostLookupState:
        LabSocketState->setText("scoket状态:HostLookupState");
        break;
    case QAbstractSocket::ConnectingState:
        LabSocketState->setText("scoket状态:ConnectingState");
        break;
    case QAbstractSocket::ConnectedState:
        LabSocketState->setText("scoket状态:ConnectedState");
        break;
    case QAbstractSocket::BoundState:
        LabSocketState->setText("scoket状态:BoundState");
        break;
    case QAbstractSocket::ClosingState:
        LabSocketState->setText("scoket状态:ClosingState");
        break;
    case QAbstractSocket::ListeningState:
        LabSocketState->setText("scoket状态:ListeningState");
    }
}

void MainWindow::onClientConnected()
{
    ui->plainTextEdit->appendPlainText("**client socket connected");
    ui->plainTextEdit->appendPlainText("**peer address:"+tcpSocket->peerAddress().toString());
    ui->plainTextEdit->appendPlainText("**peer port:"+QString::number(tcpSocket->peerPort()));
}

void MainWindow::onClientDisconnected()
{
    ui->plainTextEdit->appendPlainText("**client socket disconnected");
    tcpSocket->deleteLater();
    //    deleteLater();//QObject::deleteLater();
}

void MainWindow::onSocketReadyRead()
{
    while(tcpSocket->canReadLine()){
        ui->plainTextEdit->appendPlainText("[in] "+tcpSocket->readLine());
    }
}

void MainWindow::on_actStart_triggered()
{
    QString IP=ui->comboIP->currentText();//IP地址
    quint16 port=ui->spinPort->value();//端口
    QHostAddress addr(IP);
    tcpServer->listen(addr,port);//
    ui->plainTextEdit->appendPlainText("**开始监听...");
    ui->plainTextEdit->appendPlainText("**服务器地址:"+tcpServer->serverAddress().toString());
    ui->plainTextEdit->appendPlainText("**服务器端口:"+QString::number(tcpServer->serverPort()));

    ui->actStart->setEnabled(false);
    ui->actStop->setEnabled(true);

    LabListen->setText("监听状态:正在监听");
}

void MainWindow::on_actStop_triggered()
{
    if (tcpServer->isListening()) //tcpServer正在监听
    {
        tcpServer->close();//停止监听
        ui->actStart->setEnabled(true);
        ui->actStop->setEnabled(false);
        LabListen->setText("监听状态:已停止监听");
    }
}

void MainWindow::on_actClear_triggered()
{
    ui->plainTextEdit->clear();
}

void MainWindow::on_btnSend_clicked()
{
    QString msg=ui->editMsg->text();
    ui->plainTextEdit->appendPlainText("[out] "+msg);
    ui->editMsg->clear();
    ui->editMsg->setFocus();

    QByteArray str=msg.toUtf8();
    str.append("\r\n");//添加一个换行符
    tcpSocket->write(str);
}

void MainWindow::on_actHostInfo_triggered()
{
    QString hostName=QHostInfo::localHostName();//本地主机名
    ui->plainTextEdit->appendPlainText("本机主机名:"+hostName+"\n");
    QHostInfo hostInfo=QHostInfo::fromName(hostName);

    QList<QHostAddress> addList=hostInfo.addresses();//
    if (!addList.isEmpty())
    for (int i=0;i<addList.count();i++)
    {
        QHostAddress aHost=addList.at(i);
        if (QAbstractSocket::IPv4Protocol==aHost.protocol())
        {
            QString IP=aHost.toString();
            ui->plainTextEdit->appendPlainText("本机IP地址:"+aHost.toString());
            if (ui->comboIP->findText(IP)<0)
                ui->comboIP->addItem(IP);
        }
    }
}

  • ui界面
    在这里插入图片描述

三、代码分享

后续会写基于QT实现的UDP通信工具,下面给出代码。

  • 百度网盘
    TCPClient提取码1234
    TCPServer提取码1234
  • CSDN资源
    TCPServer
    TCPClient
TCP-网络编程-实现一个TCP Server
readyone的博客
01-29 5377
1. socket 网络层中的IP地址可以唯一确定一台主机,而传输层的 协议+端口 可以唯一表示主机中的应用程序(进程),因此利用三元组(Ip 地址,协议,端口)就可以表示网络中的进程。 进程间的通信是通过socket来完成的,socket类似于文件操作,封装了一组接口,利用这些接口完成**“打开、读/写、关闭操作”** 以TCP协议通信的socket为例,下图是TCP的交互过程: 具体过程如下: (1)服务器根据地址类型( ipv4, ipv6 )、 socket 类型、协议创建 socket (2)b
基于QT实现TCP通信TCPClient
03-24
基于QT实现TCP通信TCPClient 近期因为测试需要用到TCPServerTCP服务端)和TCPClientTCP客户端)来进行通信和数据的发送以及接受,所以用QT分别写了TCP服务端和TCP客户端,此资源为TCPClient,资源免费欢迎下载。
Qt TCPserver端举例源码
01-18
Qt TCPServer服务器端举例源码
QT+TCP通信Server端
06-29
QT+TCP通信 server端
QT网络编程之实现TCP客户端和服务端
最新发布
热土程序园:分享技术,利他愉己~
03-13 1412
QT5.12实现TCP客户端和服务端功能 1.QT实现TCP通信主要用到了以下类:QTcpServer、QTcpSocket、QHostAddress 2.基本流程: 使用QTcpServer来创建一个TCP服务器,在新的连接建立时,将新建立连接的socket添加到列表中,以便发送数据,同时监听在指定的IP地址和端口上,并在有新的客户端连接上来时进行处理; 使用QTcpSocket来创建一个TCP客户端,连接到服务器并发送数据;
QT实现TCP通信(服务器与客户端搭建)
小钱努力学C的博客
09-04 9147
【代码】QT实现TCP通信(服务器与客户端搭建)
基于QT实现TCP通信TCPServer
03-24
基于QT实现TCP通信TCPServer 近期因为测试需要用到TCPServerTCP服务端)和TCPClientTCP客户端)来进行通信和数据的发送以及接受,所以用QT分别写了TCP服务端和TCP客户端,此资源为TCPServer,资源免费欢迎下载
QT TCP Server
06-27
QT TCP Server
使用QT编写TCPclient
06-08
具有自动重连功能, 简单的文字传输功能。 可以自己更改代码,实现自己需要的功能。
QtTCP通信
热门推荐
风间琉璃的博客
10-03 1万+
TCP 协议(Transmission Control Protocol)全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是大多数 Internet 协议(包括 HTTP 和 FTP)用于数据传输的低级网络协议。它是一种可靠的,面向流,面向连接的传输协议。它特别适合连续数据传输。TCP 通信必须先建立 TCP 连接,通信端分为客户端和服务端。服务端通过监听某个端口来监听是否有客户端连接到来,如果有连接到来,则建立新的 socket 连接;
Qt中的TCP通信
龙木南的博客
10-31 6312
Qt中的TCP通信
QtTCP通信—服务端的实现
weixin_56169816的博客
06-26 1989
QTcpServer是从QObject继承的类,他主要用于服务器简历网络监听,创建网络Socket连接。其主要接口函数如图所示。QTcpSocket是从QIODevice间接继承的类,具有流读写的功能,他除了构造函数和析构函数,其他函数都是从QAbstractSocket继承或重定义的。其主要函数接口如下图所示。
TCPServer_TcpServer_tcpserver_QT_
10-02
一个简易的TCP服务器,用于测试连接。只能一对一进行传输
QT5.9利用tcp socket实现消息与文件的传输, tcpServertcpClient,,,,,,源码
04-08
QT5.9利用tcp Socke实现消息与文件的传输, tcpServer服务端和tcpClient客户端,,详见https://blog.csdn.net/qq_43569273/article/details/89091688
qt tcp server
02-09
QT 写的 tcp 服务器
基于QTTCPClientTCPServer的互通程序
03-30
QT学习中可用于借鉴的TCP小程序,如果你是刚开始,拿这个程序,可以直接从整体看看怎么用QT编写。
QT5多线程TCP服务器和客户端demo
01-07
QT5多线程TCP服务器和客户端demo
Qt TCP网络编程基本教程
m0_73443478的博客
11-23 1311
Qt TCP网络编程基本教程
Qt中使用TCP服务端及客户端
qq_25549309的博客
07-13 2779
Qt中使用TCP服务端及客户端是一种可靠、高效的方法来进行网络通信QTcpServer和QTcpSocket类提供了一个面向对象的解决方案,使得您能够轻松地开发出各种类型的网络应用程序。然而,请注意因多种原因(例如网络中断、远程主机关闭连接等)导致的时延和异常情况,并确保在代码中处理这些情况以确保应用程序的稳定性。
qt 多线程实现tcp通信
04-01
Qt提供了QtConcurrent库、QThread类和信号与槽机制来实现多线程通信。下面是一个简单的示例,演示如何使用QThread类和信号与槽机制来实现TCP通信: 1. 创建一个QTcpSocket对象,并在构造函数中连接其readyRead()信号到一个槽函数,用于接收数据。 ```c++ class TcpClient : public QObject { Q_OBJECT public: TcpClient(QObject *parent = nullptr); public slots: void readData(); private: QTcpSocket *m_socket; }; ``` ```c++ TcpClient::TcpClient(QObject *parent) : QObject(parent) { m_socket = new QTcpSocket(this); connect(m_socket, &QTcpSocket::readyRead, this, &TcpClient::readData); } ``` 2. 在槽函数中读取数据并发出信号,用于将数据发送到主线程。 ```c++ void TcpClient::readData() { QByteArray data = m_socket->readAll(); emit dataReceived(data); } ``` 3. 在主线程中创建一个TcpClient对象,并连接其dataReceived()信号到一个槽函数,用于处理接收到的数据。 ```c++ class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); public slots: void processData(QByteArray data); private: TcpClient *m_client; }; ``` ```c++ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { m_client = new TcpClient(this); connect(m_client, &TcpClient::dataReceived, this, &MainWindow::processData); } ``` 4. 在槽函数中处理接收到的数据。 ```c++ void MainWindow::processData(QByteArray data) { // 处理接收到的数据 } ``` 5. 在另一个线程中连接到服务器,并发送数据。 ```c++ class TcpThread : public QThread { Q_OBJECT public: TcpThread(QObject *parent = nullptr); signals: void error(QString message); protected: void run() override; private: QTcpSocket *m_socket; }; ``` ```c++ TcpThread::TcpThread(QObject *parent) : QThread(parent) { } void TcpThread::run() { m_socket = new QTcpSocket(); m_socket->connectToHost("127.0.0.1", 12345); if (!m_socket->waitForConnected()) { emit error(m_socket->errorString()); return; } // 发送数据 m_socket->write("Hello world!"); m_socket->flush(); } ``` 6. 在主线程中创建一个TcpThread对象,并启动线程。 ```c++ TcpThread *thread = new TcpThread(this); thread->start(); ``` 通过以上步骤,就可以在Qt实现TCP通信的多线程应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 补码、反码、原码介绍以及相互转换 19370
  • C语言学习之gcc编译四步 6709
  • 基于QT的TCP通信实现(TCPServer和TCPClient) 4858
  • 数据库中模式(schema)、内模式(internal schema)和外模式(external schema)详解 3252
  • 第一范式、第二范式和第三范式的定义和区别 3104

分类专栏

  • linux 2篇
  • QT 3篇
  • DNS 1篇
  • TCP/IP 7篇
  • 软件设计师 9篇
  • 数据库 2篇
  • 设计模式 5篇
  • 软考 9篇
  • 通信 1篇

最新评论

  • C++期末、笔试易错题整理含答案,解析(一)

    Sunny丶晴天: 隐藏那一块是说错了吗

  • 补码、反码、原码介绍以及相互转换

    梦想广东收租: 已经纠正 感谢指出

  • 补码、反码、原码介绍以及相互转换

    做而论道_CS: 只有计算机专家,才能给出让人搞笑的理由。 也只有这这种学生,能让人发笑。

  • 补码、反码、原码介绍以及相互转换

    uselessWater: 纯纯搞笑

  • 补码、反码、原码介绍以及相互转换

    做而论道_CS: 在当前,计算机,普遍,都具备了操作系统。 向计算机里面输入负数时,你可以直接就输入负数。 如,你键入:“-125”,就可以了。 并不需要你来输入补码,操作系统会帮你进行变换。 在现代计算机上,课本所讲的,都是无用的知识。 由补码换算到十进制数,也极其简单。 你只需记住:【补码首位的权,是负数】。 一般的八位二进制数,各个位的权是:   128、64、32、16、8、4、2、1; 如果是八位的补码,各个位的权则是:  -128、64、32、16、8、4、2、1。   例如,有一个补码:1110 0000, 它代表的十进制是:-128 + 64 + 32 = -32。 如果,另一个补码:0110 0000, 它代表的十进制是:0 + 64 + 32 = +96。 仅仅使用【进制转换】,不就完事了! ---------------------- 学会了二进制的加、减法,你就可以轻松实现:   数值与补码的互相转换。 老外算术能力差,算个简单的数,恨不得掰出脚趾头! 实在没有办法,才编造出来 “原码反码取反加一”。 一点小事,计算机专家就尽量往大了吹! 以显得,计算机是多么的神秘。 其实,这也就是:“自古公公好威名” 而已。 我们的老师,文化水平也太洼,看不出补码的本质。 小学的算术都弄不利索,就跟风学计算机! 捡来垃圾,一本正经的谆谆教导。 也不知道,有多少学生,因此而不及格。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Qt中信号和槽的连接方式详解(多线程)
  • DNS解析过程:从域名到IP地址的转换
  • 十、软考2013年下半年软件设计师易错题整理
2023年31篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想广东收租

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司襄樊网络广告推广价格西乡网站推广系统多少钱铜川网站搜索优化推荐恩施外贸网站制作价格迁安关键词按天收费价格德宏设计网站价格临沧网站关键词优化推荐大鹏百度seo价格龙华百度seo报价连云港关键词排名包年推广推荐广元seo网站优化长葛百度关键词包年推广多少钱张家口SEO按效果付费公司沙井SEO按天收费推荐兰州企业网站制作报价白城网站排名优化报价平湖网站seo优化报价忻州seo推荐唐山seo排名湘潭品牌网站设计哪家好大芬百度爱采购多少钱光明网站改版东营外贸网站设计多少钱平顶山SEO按天计费推荐安顺网站改版哪家好上饶关键词排名报价龙华阿里店铺托管价格济源优化推荐黔西南seo公司临猗阿里店铺运营哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化