QT TCP服务器/客户端

服务器

首先要在.pro文件中添加network,否则将不能使用QTcpserver

cpp 复制代码
QT       += core gui network
cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#define PORT 8000

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void newClientHandler();
    void clientInfoSlot();

    void on_sendButton_clicked();

private:
    Ui::Widget *ui;
    QTcpServer *server;
    QTcpSocket *socket;
};
#endif // WIDGET_H
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    server = new QTcpServer;
    server->listen(QHostAddress::AnyIPv4,PORT);
    connect(server,&QTcpServer::newConnection,this,&Widget::newClientHandler);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::newClientHandler()
{
    //建立TCP连接
    socket = server->nextPendingConnection();
    ui->addresslineEdit->setText(socket->peerAddress().toString());
    ui->portlineEdit->setText(QString::number(socket->peerPort()));
    connect(socket,&QTcpSocket::readyRead,this,&Widget::clientInfoSlot);

}
void Widget::clientInfoSlot()
{
    //获取信号的发出者
    QTcpSocket *socket=(QTcpSocket *)sender();
    ui->revlineEdit->setText(QString(socket->readAll()));
}

void Widget::on_sendButton_clicked()
{
    QByteArray ba;
    ba.append(ui->sendlineEdit->text().toLatin1());
    socket->write(ba);
}

客户端

同样的,别忘了在.pro文件中修改

cpp 复制代码
QT       += core gui network
cpp 复制代码
#ifndef CHAT_H
#define CHAT_H

#include <QWidget>
#include<QTcpSocket>
namespace Ui {
class chat;
}

class chat : public QWidget
{
    Q_OBJECT

public:
    explicit chat(QTcpSocket *socket,QWidget *parent = nullptr);
    ~chat();

private slots:
    void on_sendButton_clicked();

    void on_clearButton_clicked();

    void clientReadHandler();

private:
    Ui::chat *ui;
    QTcpSocket *socket;
};

#endif // CHAT_H
cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpsocket>
#include<QHostAddress>
#include<QMessageBox>
#include "chat.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_cancelButton_clicked();

    void on_connectButton_clicked();

private:
    Ui::Widget *ui;
    QTcpSocket *socket;
    chat *ch;
};
#endif // WIDGET_H
cpp 复制代码
#include "chat.h"
#include "ui_chat.h"

chat::chat(QTcpSocket *s,QWidget *parent) :
    QWidget(parent),
    ui(new Ui::chat)
{
    ui->setupUi(this);
    socket = s;
    connect(socket,&QTcpSocket::readyRead,this,&chat::clientReadHandler);
}

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

void chat::on_sendButton_clicked()
{
    QByteArray ba;
    ba.append(ui->lineEdit->text().toLatin1());
    socket->write(ba);
}


void chat::on_clearButton_clicked()
{
    ui->lineEdit->clear();
}

void chat::clientReadHandler()
{
    ui->revlineEdit->setText(QString(socket->readAll()));
}
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    socket = new QTcpSocket;
}

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

void Widget::on_connectButton_clicked()
{
    QString ip = ui->iplineEdit->text();
    QString port = ui->portlineEdit->text();
    qDebug() << ip;
    qDebug() << port;

    socket->connectToHost(QHostAddress(ip),port.toShort());
    connect(socket,&QTcpSocket::connected,[this]{
        QMessageBox::information(this,"Tip","连接成功");
        this->hide();
        ch = new chat(socket);
        ch->show();
    });
    connect(socket,&QTcpSocket::disconnected,[this]{
        QMessageBox::information(this,"Tip","连接失败!");
    });
}

void Widget::on_cancelButton_clicked()
{
    this->close();
}


相关推荐
Felix_One3 天前
Qt 串口通信避坑指南:QSerialPort 的 5 个常见问题
qt
茶杯梦轩4 天前
从零起步学习RabbitMQ || 第二章:RabbitMQ 深入理解概念 Producer、Consumer、Exchange、Queue 与企业实战案例
服务器·后端·消息队列
blasit6 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
YuMiao6 天前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
Sinclair9 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
Rockbean10 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
茶杯梦轩10 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试
海天鹰11 天前
【免费】PHP主机=域名+解析+主机
服务器
不是二师兄的八戒11 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器
芝士雪豹只抽瑞克五11 天前
Nginx 高性能Web服务器笔记
服务器·nginx