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();
}


相关推荐
晓晓_za8986689 分钟前
Geo 优化源码蒸馏词机制:地域词库构建与匹配逻辑详解
运维·tcp/ip·spring·缓存·ci/cd
Android系统攻城狮1 小时前
Linux PipeWire深度解析之pw_stream_new调用流程与实战(七十八)
linux·运维·服务器·音频进阶·pipewire音频实战进阶
Zguigo2 小时前
lesson30-32计算机网络第四章:网络层核心三课(作用、IP协议、IPv4地址)
tcp/ip·计算机网络·php
weipt3 小时前
从ollama到llama.cpp
linux·服务器·llama
s_w.h3 小时前
【 计网 】计算机网络基础
服务器·计算机网络
程与留3 小时前
06_Qt 常用数据类型与容器:QString、QList、QVector、QMap 的性能与实现分析
数据结构·qt
在世修行5 小时前
激光打标机TCP Socket通信协议:KZ指令集实战
tcp/ip·socket·自定义协议
怪侠_岭南一只猿6 小时前
[简单理解]小龙虾是怎么一回事?
运维·服务器·ai
海兰6 小时前
【应用】Wastnet 框架的 SSE (Server-Sent Events)从协议原理到实践指南
运维·服务器·人工智能
2401_894915537 小时前
Geo 优化源码部署实战:环境配置、参数调优完整指南
运维·服务器·数据库·tcp/ip·安全