Qt TCP (小型聊天窗口)

文章介绍了如何使用QT库中的QTcpServer和QTcpSocket类建立一个简单的TCP服务器和客户端应用。服务器端能监听连接、主动断开和发送信息,客户端可输入主机和端口进行连接、断开和发送信息。双方都能查看聊天记录。
摘要由CSDN通过智能技术生成

实现的具体功能为:

  1. 服务器端需要主动监听,可以主动断开连接,可以发送信息给客户端
  2. 客户端需要输入主机,端口号,需要主动连接,可以主动断开连接,可以发送信息给服务器端
  3. 服务器端和客户端都能看到聊天记录

服务器端的搭建:

创建一个TCP_Server项目

1.首先在.Pro文件中添加:

QT+=network

ui界面中添加以下控件:

 2. tcp_server.h文件

#ifndef TCP_SERVER_H
#define TCP_SERVER_H

#include <QWidget>
#include<QTcpServer>
#include<QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class tcp_server; }
QT_END_NAMESPACE

class tcp_server : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::tcp_server *ui;
    QTcpServer * server;//服务器对象
    QTcpSocket * socket=nullptr;//套接字


};
#endif // TCP_SERVER_H

3.tcp_server.cpp文件

#include "tcp_server.h"
#include "ui_tcp_server.h"
#include<QMessageBox>
tcp_server::tcp_server(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::tcp_server)
{
    ui->setupUi(this);
    server=new QTcpServer(this);
    connect(server,&QTcpServer::newConnection,[=]()//当有连接时
    {
        int ret=QMessageBox::information(this,"提示信息","已有连接,是否连接。",QMessageBox::Yes|QMessageBox::No);
        if(ret==QMessageBox::Yes)
        {
            QMessageBox::information(this,"提示信息","已成功连接。",QMessageBox::Ok);
            socket=new QTcpSocket;
            socket=server->nextPendingConnection();//获取套接字
            connect(socket,&QTcpSocket::readyRead,[=]()//如果有新数据
            {
                QByteArray S=socket->readAll();//读取全部内容
                QString str=S.data();//转化为字符串格式
                ui->textEdit->append(QString("客户端:%1").arg(str));//把数据添加到textEdit中
            });
            connect(socket,&QTcpSocket::disconnected,socket,&QTcpSocket::deleteLater);//断开连接后,删除该套接字
        }
        else
        {
            QMessageBox::information(this,"提示信息","已拒绝连接。",QMessageBox::Ok);
        }

    });

}

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


void tcp_server::on_pushButton_clicked()//listen
{
    //监听主机和端口
    if(!server->listen(QHostAddress("127.0.0.1"),6000))
    {
        QMessageBox::information(this,"提示信息","未监听成功",QMessageBox::Ok);
    }
}

void tcp_server::on_pushButton_3_clicked()//断开连接
{
    if(socket==nullptr)
    {
        QMessageBox::information(this,"提示信息","暂无连接。",QMessageBox::Ok);
    }
    else
    {
        socket->disconnectFromHost();//断开连接,如有未接收完的数据,要先接收完
        QMessageBox::information(this,"提示信息","已成功断开。",QMessageBox::Ok);
        delete socket;//释放内存
        socket=nullptr;//置空
    }

}

void tcp_server::on_pushButton_2_clicked()//发送数据
{
    if(socket==nullptr)
    {
        QMessageBox::information(this,"提示信息","暂无连接,无法传输数据。",QMessageBox::Ok);
    }
    else
    {
        ui->textEdit->append(QString("服务器端:%1").arg(ui->lineEdit->text()));//把记录放在textEdit中
        QByteArray S=ui->lineEdit->text().toUtf8();//将QString转化为QByteQrray
        socket->write(S);//传输数据
    }
}

客户端的搭建:

创建一个TCP_Client项目

1.pro文件添加

QT+=network

ui界面中添加:

 2. tcp_client.h文件

#ifndef TCP_CLIENT_H
#define TCP_CLIENT_H

#include <QWidget>
#include<QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class tcp_client; }
QT_END_NAMESPACE

class tcp_client : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();//连接

    void on_pushButton_2_clicked();//断开

    void on_pushButton_3_clicked();//发送

private:
    Ui::tcp_client *ui;
    QTcpSocket *Socket;//套接字

};
#endif // TCP_CLIENT_H

3.tcp_client.cpp文件

#include "tcp_client.h"
#include "ui_tcp_client.h"
#include<QMessageBox>
tcp_client::tcp_client(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::tcp_client)
{
    ui->setupUi(this);
    Socket=new QTcpSocket(this);
    connect(Socket,&QTcpSocket::readyRead,[=]()
    {
        QByteArray bt=Socket->readAll();//读取服务器发送的内容
        QString str=bt.data();//转化为QString
        ui->textEdit->append(QString("服务器:%1").arg(str));//把内容放在textEdit
    });

}

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


void tcp_client::on_pushButton_clicked()//连接到服务器
{
    Socket->abort();//断开已有连接
    Socket->connectToHost(ui->lineEdit->text(),ui->lineEdit_2->text().toInt());//连接到服务器
}

void tcp_client::on_pushButton_2_clicked()//断开
{
    Socket->disconnectFromHost();//断开连接
    QMessageBox::information(this,"提示信息","已断开",QMessageBox::Ok);
}

void tcp_client::on_pushButton_3_clicked()//发送
{
    if(Socket->state()==QAbstractSocket::ConnectedState)//如果为连接状态
    {
        ui->textEdit->append(QString("客户端:%1").arg(ui->lineEdit_3->text()));//把内容添加到textEdit中
        QByteArray bta=ui->lineEdit_3->text().toUtf8();
        Socket->write(bta);//传输数据
    }
    else
    {
        QMessageBox::information(this,"提示信息","未连接,无法发送",QMessageBox::Ok);
    }
}

以下为运行过程:

 输入主机和端口号然后点击连接,然后点击listen监听

 点击yes即可连接

 服务器端向客户端发信息:

 客户端向服务器端发信息:

 点击断开连接,即可断开:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值