首页 > 其他分享 >Qt TCP (小型聊天窗口)

Qt TCP (小型聊天窗口)

时间:2024-03-14 19:34:36浏览次数:26  
标签:Qt tcp server client ui TCP QMessageBox socket 聊天

实现的具体功能为:

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

服务器端的搭建:

创建一个TCP_Server项目

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

QT+=network

ui界面中添加以下控件:

 2. tcp_server.h文件

 1 #ifndef TCP_SERVER_H
 2 #define TCP_SERVER_H
 3  
 4 #include <QWidget>
 5 #include<QTcpServer>
 6 #include<QTcpSocket>
 7 QT_BEGIN_NAMESPACE
 8 namespace Ui { class tcp_server; }
 9 QT_END_NAMESPACE
10  
11 class tcp_server : public QWidget
12 {
13     Q_OBJECT
14  
15 public:
16     tcp_server(QWidget *parent = nullptr);
17     ~tcp_server();
18  
19 private slots:
20     void on_pushButton_clicked();
21  
22     void on_pushButton_3_clicked();
23  
24     void on_pushButton_2_clicked();
25  
26 private:
27     Ui::tcp_server *ui;
28     QTcpServer * server;//服务器对象
29     QTcpSocket * socket=nullptr;//套接字
30  
31  
32 };
33 #endif // TCP_SERVER_H

3.tcp_server.cpp文件

 1 #include "tcp_server.h"
 2 #include "ui_tcp_server.h"
 3 #include<QMessageBox>
 4 tcp_server::tcp_server(QWidget *parent)
 5     : QWidget(parent)
 6     , ui(new Ui::tcp_server)
 7 {
 8     ui->setupUi(this);
 9     server=new QTcpServer(this);
10     connect(server,&QTcpServer::newConnection,[=]()//当有连接时
11     {
12         int ret=QMessageBox::information(this,"提示信息","已有连接,是否连接。",QMessageBox::Yes|QMessageBox::No);
13         if(ret==QMessageBox::Yes)
14         {
15             QMessageBox::information(this,"提示信息","已成功连接。",QMessageBox::Ok);
16             socket=new QTcpSocket;
17             socket=server->nextPendingConnection();//获取套接字
18             connect(socket,&QTcpSocket::readyRead,[=]()//如果有新数据
19             {
20                 QByteArray S=socket->readAll();//读取全部内容
21                 QString str=S.data();//转化为字符串格式
22                 ui->textEdit->append(QString("客户端:%1").arg(str));//把数据添加到textEdit中
23             });
24             connect(socket,&QTcpSocket::disconnected,socket,&QTcpSocket::deleteLater);//断开连接后,删除该套接字
25         }
26         else
27         {
28             QMessageBox::information(this,"提示信息","已拒绝连接。",QMessageBox::Ok);
29         }
30  
31     });
32  
33 }
34  
35 tcp_server::~tcp_server()
36 {
37     delete ui;
38 }
39  
40  
41 void tcp_server::on_pushButton_clicked()//listen
42 {
43     //监听主机和端口
44     if(!server->listen(QHostAddress("127.0.0.1"),6000))
45     {
46         QMessageBox::information(this,"提示信息","未监听成功",QMessageBox::Ok);
47     }
48 }
49  
50 void tcp_server::on_pushButton_3_clicked()//断开连接
51 {
52     if(socket==nullptr)
53     {
54         QMessageBox::information(this,"提示信息","暂无连接。",QMessageBox::Ok);
55     }
56     else
57     {
58         socket->disconnectFromHost();//断开连接,如有未接收完的数据,要先接收完
59         QMessageBox::information(this,"提示信息","已成功断开。",QMessageBox::Ok);
60         delete socket;//释放内存
61         socket=nullptr;//置空
62     }
63  
64 }
65  
66 void tcp_server::on_pushButton_2_clicked()//发送数据
67 {
68     if(socket==nullptr)
69     {
70         QMessageBox::information(this,"提示信息","暂无连接,无法传输数据。",QMessageBox::Ok);
71     }
72     else
73     {
74         ui->textEdit->append(QString("服务器端:%1").arg(ui->lineEdit->text()));//把记录放在textEdit中
75         QByteArray S=ui->lineEdit->text().toUtf8();//将QString转化为QByteQrray
76         socket->write(S);//传输数据
77     }
78 }

客户端的搭建:

创建一个TCP_Client项目

1.pro文件添加

QT+=network

ui界面中添加:

 2. tcp_client.h文件

 1 #ifndef TCP_CLIENT_H
 2 #define TCP_CLIENT_H
 3  
 4 #include <QWidget>
 5 #include<QTcpSocket>
 6 QT_BEGIN_NAMESPACE
 7 namespace Ui { class tcp_client; }
 8 QT_END_NAMESPACE
 9  
10 class tcp_client : public QWidget
11 {
12     Q_OBJECT
13  
14 public:
15     tcp_client(QWidget *parent = nullptr);
16     ~tcp_client();
17  
18 private slots:
19     void on_pushButton_clicked();//连接
20  
21     void on_pushButton_2_clicked();//断开
22  
23     void on_pushButton_3_clicked();//发送
24  
25 private:
26     Ui::tcp_client *ui;
27     QTcpSocket *Socket;//套接字
28  
29 };
30 #endif // TCP_CLIENT_H

3.tcp_client.cpp文件

 1 #include "tcp_client.h"
 2 #include "ui_tcp_client.h"
 3 #include<QMessageBox>
 4 tcp_client::tcp_client(QWidget *parent)
 5     : QWidget(parent)
 6     , ui(new Ui::tcp_client)
 7 {
 8     ui->setupUi(this);
 9     Socket=new QTcpSocket(this);
10     connect(Socket,&QTcpSocket::readyRead,[=]()
11     {
12         QByteArray bt=Socket->readAll();//读取服务器发送的内容
13         QString str=bt.data();//转化为QString
14         ui->textEdit->append(QString("服务器:%1").arg(str));//把内容放在textEdit
15     });
16  
17 }
18  
19 tcp_client::~tcp_client()
20 {
21     delete ui;
22 }
23  
24  
25 void tcp_client::on_pushButton_clicked()//连接到服务器
26 {
27     Socket->abort();//断开已有连接
28     Socket->connectToHost(ui->lineEdit->text(),ui->lineEdit_2->text().toInt());//连接到服务器
29 }
30  
31 void tcp_client::on_pushButton_2_clicked()//断开
32 {
33     Socket->disconnectFromHost();//断开连接
34     QMessageBox::information(this,"提示信息","已断开",QMessageBox::Ok);
35 }
36  
37 void tcp_client::on_pushButton_3_clicked()//发送
38 {
39     if(Socket->state()==QAbstractSocket::ConnectedState)//如果为连接状态
40     {
41         ui->textEdit->append(QString("客户端:%1").arg(ui->lineEdit_3->text()));//把内容添加到textEdit中
42         QByteArray bta=ui->lineEdit_3->text().toUtf8();
43         Socket->write(bta);//传输数据
44     }
45     else
46     {
47         QMessageBox::information(this,"提示信息","未连接,无法发送",QMessageBox::Ok);
48     }
49 }

以下为运行过程:

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

 点击yes即可连接

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

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

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

 

标签:Qt,tcp,server,client,ui,TCP,QMessageBox,socket,聊天
From: https://www.cnblogs.com/ybqjymy/p/18073744

相关文章

  • Qt TcpSocket的掉线解决方法
    1、tcpip协议没什么好说的,号称保证传输准确可靠,使命必达。协议很大一坨,实际应用上用得上的很少。2、问题所在在使用tcp协议跟服务器连接后(分别测试过windows系统,ubuntu系统单片机带tcpip协议的通讯模块)都发现不能及时反馈或反馈网络已断;(在同一个局域网内和公共网络上......
  • Qt TCP通信客户端断开连接有哪些方法
    在QT中,可以使用以下方法来处理TCP通信客户端断开连接的情况:使用QAbstractSocket::disconnected信号:当客户端与服务器断开连接时,该信号会被触发。你可以连接这个信号到一个槽函数,在槽函数中处理断开连接的逻辑。QObject::connect(socket,&QTcpSocket::disconnected,this,&You......
  • PyQT可视化开发-保姆级教程
    背景因为在公司中负责小工具的开发(数据处理文件生成等),不可避免的会使用到Python的窗体界面,最初都是手敲出来的,费时费力,后来在网上百度了一下,发现一款比较好用的工具-QTdesigner,使用鼠标拖拽就可以完成窗体的设计,方便好用。话不多说。现在就体验一下这个工具的强大之处吧。1.......
  • 一文彻底搞懂OSI七层模型和TCP/IP四层模型
    文章目录1.OSI七层模型2.TCP/IP四层模型1.OSI七层模型OSI(OpenSystemInterconnect)七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能,从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时,更好地理解和......
  • 常用AI聊天画图网站-国内外大模型
    AI聊天腾讯混元助手通义千问讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞智谱AI开放平台智谱清言百川大模型-汇聚世界知识创作妙笔生花-百川智能文心一言Kimi.ai-帮你看更大的世界AI画图通义万相_AI创意作画_AI绘画_人工智能-阿里云Midjourney-中国官......
  • Qt "QWidget: Must construct a Qapplication before a Qwidget"错误
    问题该错误信息表示在创建QWidget(窗口部件)之前必须先创建QApplication(应用程序)。这是因为QApplication在创建QWidget之前会进行一些初始化操作,确保正确运行应用程序。要解决这个错误,您需要在创建QWidget之前先创建QApplication。以下是处理该错误的常见方法:1.在......
  • Qt 解决:QWidget: Must construct a QApplication before a QWidget
    在调试vlc-qt的examples工程时,遇到编译报错“QWidget:MustconstructaQApplicationbeforeaQWidget”根据字面理解应该是,创建窗体前应该必须先构造一个QApplication。网上很多人也遇到过这样的问题,也确实是这个原因,如下:但是本人遇到的问题却不是这个,最后查找......
  • 用JavaSocket编程开发聊天室
    1.设计内容1.用Java图形用户界面编写聊天室服务器端和客户端,支持多个客户端连接到一个服务器。每个客户端能够输入账号。2.可以实现群聊(聊天记录显示在所有客户端界面)。3.完成好友列表在各个客户端上显示。4.可以实现私人聊天,用户可以选择某个其他用户,单独发送信息。......
  • TCP协议
    TCP协议TCP协议的头部为20ByteTCP头部的数据格式端口号:各占2个字节,端口号与IP首部中的源端IP地址和目的端IIP地址唯一确定一个TCP连接。序号:占4字节,整个要传送的字节流的起始序号必须在连接建立时设置确认号:占4字节,是期望收到对方下一个报文段的第一个数据字节......
  • QT事件处理
    这里仅作为个人记录,详细见博客:https://www.cnblogs.com/xiaobingqianrui/p/9547924.htmlQT提供了五种不同级别的事件处理和过滤:    A、重写特定事件处理函数.    最常见的事件处理办法就是重写mousePressEvent(),keyPressEvent(),paintEvent() 等特定事件处理函......