QT实现TCP和UDP协议通信(二)
编程环境 :Windows10 x64 下 QtCreator
语言 :C++
作者 :wddkxg
时间 :2022.4.24
项目 :Server + Client
**Client(客户端)**
1.创建新项目 选择Qt Widget Application即可 。
2.项目工程文件中(.pro)加入 QT += network
3.引入头文件 , ,
4.ui 界面设计 :
一个lineEdit用于输入端口号,一个lineEdit用于输入ip地址,一个PushButton为连接按钮,
一个PushButton为发送按钮,两个复选框可以选择TCP或UDP协议,一个lineEdit用于显示连接状态,
一个TextEdit用于输入要发送信息的文本。
![Client的ui设计](http://www.kaotop.com/file/tupian/20220426/45e3929024f14a748dd369dae1b3b5f5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6YeR5puc5pel44Gu5paw5oGS,size_13,color_FFFFFF,t_70,g_se,x_16#pic_center)
5.Client需要的几个功能:断开连接、TCP协议连接、发送数据
void socket_disconnected();//断开连接
void on_pushButtonconnect_clicked();//TCP连接
void on_pushButton_send_clicked();//发送数据
6.创建对象:
QTcpSocket *mSocket;//TCP套接字对象
QUdpSocket *uSocket;//UDP套接字对象
7.源码:
client.h
#ifndef APP_H
#define APP_H
#include
#include
#include
#include
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class App; }
QT_END_NAMESPACE
/*客户端*/
class App : public QMainWindow
{
Q_OBJECT
public:
App(QWidget *parent = nullptr);
~App();
public slots:
void onTimeOut();//计时器
private slots:
void socket_disconnected();//断开连接
void on_pushButtonconnect_clicked();//TCP连接
void on_pushButton_send_clicked();//发送数据
void on_checkBox_auto_clicked(bool checked);//自动发送
private:
Ui::App *ui;
QTcpSocket *mSocket;//TCP套接字对象
QUdpSocket *uSocket;//UDP套接字对象
QTimer *tim;//定时器对象
};
#endif // APP_H
client.cpp
/*****************************************************************************************/
/* 客户端 */
/* 2022.03.02 */
/* wddkxg */
/* v1.0 */
/*****************************************************************************************/
#include "client.h"
#include "ui_client.h"
#include
#include
#include
/*构造函数*/
App::App(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::App)
{
ui->setupUi(this);
ui->ipEdit->setText("10.0.0.58");//默认显示ip为192.168.1.44
ui->portEdit->setText("8080");//默认显示端口为8080
mSocket = new QTcpSocket();//TCP套接字初始化
ui->pushButton_send->setEnabled(true);
QObject::connect(mSocket,&QTcpSocket::readyRead,this,&App::on_pushButton_send_clicked);
QObject::connect(mSocket,&QTcpSocket::disconnected,this,&App::socket_disconnected);
uSocket = new QUdpSocket(this);//UDP套接字初始化
tim = new QTimer();//初始化计时器对象
tim->setInterval(1000);//设置计时器间隔时间为1s
connect(tim,SIGNAL(timeout()),this,SLOT(onTimeOut()));//连接信号槽
tim->start();//初始化计时器状态
}
/*析构函数*/
App::~App()
{
delete this->uSocket;
delete this->mSocket;
delete ui;
}
/*TCP连接*/
void App::on_pushButtonconnect_clicked()
{
if(ui->pushButtonconnect->text() == QString::fromLocal8Bit("连接"))
{
QString IP;
int port;
IP = ui->ipEdit->text(); //获取IP地址
port = ui->portEdit->text().toInt(); //获取端口号
mSocket->abort();//取消已有的连接
mSocket->connectToHost(IP, port);//连接服务器
if(!mSocket->waitForConnected(30000))//等待连接成功
{
qDebug() << "Connection failed!";
ui->lineEdit_state->setText(QString::fromLocal8Bit("连接失败!"));
return;
}
qDebug() << "Connect successfully!";
ui->lineEdit_state->setText(QString::fromLocal8Bit("连接成功!"));
ui->pushButton_send->setEnabled(true);//发送按键使能
ui->pushButtonconnect->setText(QString::fromLocal8Bit("断开连接"));//修改按键文字
}
else
{
mSocket->disconnectFromHost();//断开连接
ui->pushButtonconnect->setText(QString::fromLocal8Bit("连接"));//修改按键文字
ui->pushButton_send->setEnabled(true);//发送按键使能
}
}
/*发送数据*/
void App::on_pushButton_send_clicked()
{
qDebug()<<"Send: "<<ui->textEdit_enter->toPlainText().toLatin1();
if(ui->radioButton_TCP->isChecked())//判断使用TCP协议
{
qDebug()<<"TCP";
mSocket->write(ui->textEdit_enter->toPlainText().toLatin1());//tcp协议下客户端发送框内容写入缓冲
mSocket->flush();
}
else if(ui->radioButton_UDP->isChecked())//判断使用UDP协议
{
qDebug()<<"UDP";
uSocket->writeDatagram(ui->textEdit_enter->toPlainText().toLatin1(),QHostAddress("10.0.0.58"),8080);//udp协议下客户端发送框内容写入缓冲
uSocket->flush();
}
else
{
ui->lineEdit_state->setText("choose TCP or UDP ");//未选择协议
}
}
/*断开连接*/
void App::socket_disconnected()
{
ui->pushButton_send->setEnabled(false);//关闭发送按键
ui->pushButtonconnect->setText(QString::fromLocal8Bit("连接"));//显示
qDebug()<<"Disconnected!";
}
/*自动发送*/
void App::on_checkBox_auto_clicked(bool checked)
{
if(checked)//判断自动发送是否选中
{
onTimeOut();//调用计时器延时发送
}
}
/*设置定时器延时发送*/
void App::onTimeOut()
{
if(ui->checkBox_auto->isChecked())//判断自动发送是否选中
{
static int value = 0;
ui->progressBar->setValue(value++);
if(value>5)//延时5秒发送一次
{
tim->stop();
on_pushButton_send_clicked();
tim->start();
ui->progressBar->setValue(value = 0);
ui->checkBox_auto->setChecked(false);
}
}
}
main1.cpp
#include "client.h"
#include
int main(int argc, char *argv[])//主函数
{
QApplication a(argc, argv);
App w;
w.show();
w.onTimeOut();
return a.exec();
}
8.源码中ui设计新增了一些内容,可以看情况删减使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)