这段时间用到了QT的TCP通信,做了初步的学习与尝试,编写了一个客户端和服务器基于窗口通信的小例程。
使用QT的网络套接字需要.pro文件中加入一句:
QT += network
一、客户端
(相关资料图)
1、客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步:
(1)创建QTcpSocket套接字对象
socket = new QTcpSocket();
(2)使用这个对象连接服务器
socket->connectToHost(IP, port);
(3)使用write函数向服务器发送数据
socket->write(data)
(4)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);void MainWindow::socket_Read_Data(){QByteArray buffer;//读取缓冲区数据buffer = socket->readAll();}
(5)断开与服务器的连接(关于close()和disconnectFromHost()的区别,可以按F1看帮助)
socket->disconnectFromHost();
2、以下是客户端的例程
首先是mainwindow.h文件:
//mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include #include namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_pushButton_Connect_clicked();void on_pushButton_Send_clicked();void socket_Read_Data();void socket_Disconnected();private:Ui::MainWindow *ui;QTcpSocket *socket;};#endif // MAINWINDOW_H
然后是mainwindow.cpp文件:
//mainwindow.cpp#include \"mainwindow.h\"#include \"ui_mainwindow.h\"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);socket = new QTcpSocket();//连接信号槽QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);ui->pushButton_Send->setEnabled(false);ui->lineEdit_IP->setText(\"127.0.0.1\");ui->lineEdit_Port->setText(\"8765\");}MainWindow::~MainWindow(){delete this->socket;delete ui;}void MainWindow::on_pushButton_Connect_clicked(){if(ui->pushButton_Connect->text() == tr(\"连接\")){QString IP;int port;//获取IP地址IP = ui->lineEdit_IP->text();//获取端口号port = ui->lineEdit_Port->text().toInt();//取消已有的连接socket->abort();//连接服务器socket->connectToHost(IP, port);//等待连接成功if(!socket->waitForConnected(30000)){qDebug() << \"Connection failed!\";return;}qDebug() << \"Connect successfully!\";//发送按键使能ui->pushButton_Send->setEnabled(true);//修改按键文字ui->pushButton_Connect->setText(\"断开连接\");}else{//断开连接socket->disconnectFromHost();//修改按键文字ui->pushButton_Connect->setText(\"连接\");ui->pushButton_Send->setEnabled(false);}}void MainWindow::on_pushButton_Send_clicked(){qDebug() << \"Send: \" << ui->textEdit_Send->toPlainText();//获取文本框内容并以ASCII码形式发送socket->write(ui->textEdit_Send->toPlainText().toLatin1());socket->flush();}void MainWindow::socket_Read_Data(){QByteArray buffer;//读取缓冲区数据buffer = socket->readAll();if(!buffer.isEmpty()){QString str = ui->textEdit_Recv->toPlainText();str+=tr(buffer);//刷新显示ui->textEdit_Recv->setText(str);}}void MainWindow::socket_Disconnected(){//发送按键失能ui->pushButton_Send->setEnabled(false);//修改按键文字ui->pushButton_Connect->setText(\"连接\");qDebug() << \"Disconnected!\";}
最后是ui的设计:
二、服务器
1、服务器除了使用到了QTcpSocket类,还需要用到QTcpSever类。即便如此,也只是比客户端复杂一点点,用到了6个步骤:
(1)创建QTcpSever对象
server = new QTcpServer();
(2)侦听一个端口,使得客户端可以使用这个端口访问服务器
server->listen(QHostAddress::Any, port);
(3)当服务器被客户端访问时,会发出newConnection()信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问
connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);void MainWindow::server_New_Connect(){//获取客户端连接socket = server->nextPendingConnection();}
(4)使用socket的write函数向客户端发送数据
socket->write(data)
(5)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据
QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);void MainWindow::socket_Read_Data(){QByteArray buffer;//读取缓冲区数据buffer = socket->readAll();}
(6)取消侦听
server->close();
2、以下是服务器的例程
首先是mainwindow.h文件:
//mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include #include #include namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_pushButton_Listen_clicked();void on_pushButton_Send_clicked();void server_New_Connect();void socket_Read_Data();void socket_Disconnected();private:Ui::MainWindow *ui;QTcpServer* server;QTcpSocket* socket;};#endif // MAINWINDOW_H
然后是mainwindow.cpp文件:
#include \"mainwindow.h\"#include \"ui_mainwindow.h\"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);ui->lineEdit_Port->setText(\"8765\");ui->pushButton_Send->setEnabled(false);server = new QTcpServer();//连接信号槽connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);}MainWindow::~MainWindow(){server->close();server->deleteLater();delete ui;}void MainWindow::on_pushButton_Listen_clicked(){if(ui->pushButton_Listen->text() == tr(\"侦听\")){//从输入框获取端口号int port = ui->lineEdit_Port->text().toInt();//监听指定的端口if(!server->listen(QHostAddress::Any, port)){//若出错,则输出错误信息qDebug()<errorString();return;}//修改按键文字ui->pushButton_Listen->setText(\"取消侦听\");qDebug()<< \"Listen succeessfully!\";}else{/*//如果正在连接(点击侦听后立即取消侦听,若socket没有指定对象会有异常,应修正——2017.9.30)if(socket->state() == QAbstractSocket::ConnectedState){//关闭连接socket->disconnectFromHost();}*/socket->abort();//取消侦听server->close();//修改按键文字ui->pushButton_Listen->setText(\"侦听\");//发送按键失能ui->pushButton_Send->setEnabled(false);}}void MainWindow::on_pushButton_Send_clicked(){qDebug() << \"Send: \" << ui->textEdit_Send->toPlainText();//获取文本框内容并以ASCII码形式发送socket->write(ui->textEdit_Send->toPlainText().toLatin1());socket->flush();}void MainWindow::server_New_Connect(){//获取客户端连接socket = server->nextPendingConnection();//连接QTcpSocket的信号槽,以读取新数据QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);//发送按键使能ui->pushButton_Send->setEnabled(true);qDebug() << \"A Client connect!\";}void MainWindow::socket_Read_Data(){QByteArray buffer;//读取缓冲区数据buffer = socket->readAll();if(!buffer.isEmpty()){QString str = ui->textEdit_Recv->toPlainText();str+=tr(buffer);//刷新显示ui->textEdit_Recv->setText(str);}}void MainWindow::socket_Disconnected(){//发送按键失能ui->pushButton_Send->setEnabled(false);qDebug() << \"Disconnected!\";}
最后是ui的设计:
三、运行结果
【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里:
新化月报网报料热线:886 2395@qq.com
最近更新
- 世界看点:Qt 实现简单的TCP通信2023-05-25
- 系统教程篇:各个win7系统版本的区别_环球播报2023-05-25
- 全球今日讯!大自然强化地板甲醛严重吗2023-05-25
- 天天观速讯丨重大利好!电影行业迎来政策红包,将带来什么改变2023-05-25
- 天天滚动:共建创新生态圈!西门子医疗携手张江集团举办首届医疗科技创新先锋论坛2023-05-25
- 金埔园林:5月24日获融资买入118.11万元,占当日流入资金比例10.11% 天天日报2023-05-25
- 海信激光电视亮相成都太古里 超凡演绎《嘉人》虚拟未来时尚艺术展2023-05-25
- 探析绿色智造之路 共话中国纺织行业美好未来2023-05-25
- 【新视野】传媒、游戏股持续走弱 唐德影视跌超10% 2023-05-25
- 央媒说“宁” | 南京新街口街道香铺营社区新时代文明实践站——接地气做宣讲 贴需求强服务 世界速看2023-05-25
- 天天微速讯:未来智能发布全新录音降噪会议耳机iFLYBUDSNano系列,AI让开会更高效2023-05-25
- 2016年到2022年,毕业生到合作企业就业人次增长10倍 甘肃4所院校晒出“毕业即就业”成绩单2023-05-25
- 甘肃公路博物馆入选第二批“国家交通运输科普基地”2023-05-25
- 天天亮点!探索“合作社+企业”产业模式 农家乐带动村民走出致富路2023-05-25
- 兰州皋兰县文山小学师生“零距离”感受非遗魅力2023-05-25
- “美好生活基层行 知名作家看益阳”调研活动侧记2023-05-25
- 大沙河科创走廊之上,低密山水住宅,鼎胜金域阳光-全球滚动2023-05-25
- 环球热推荐:深圳西部“菜篮子”保供基地 光明海吉星即将开园2023-05-25
- 【天天速看料】最快仅需40分钟!深大城际又有新进展2023-05-25
- 8个项目上榜!龙华区建筑工务署“双优工地”再创新高2023-05-25
- 种菜虽好,可别刨错了地方2023-05-25
- 环球最新:港股内房股连续走低 融创中国跌超5%2023-05-25
- 观点:4月江苏查处违反中央八项规定精神问题398起2023-05-25
- 4个方面告诉你:练腿的重要性!附:一组腿部训练动图2023-05-25
- 聚焦教学质量提升 七中育才开展青年教师教学质量提升培训 天天快看2023-05-25
- 创新营销与AI共行——2023百度AI营销中国行走进郑州 让科技助力企业腾飞2023-05-25
- 新资讯:正海生物:5月24日融券卖出金额36.59万元,占当日流出金额的1%2023-05-25
- 甘肃成县:大蒜飘香民富乡村兴2023-05-25
- 全球即时看!“两高”发布司法解释:从严惩处强奸、猥亵等性侵害未成年人犯罪2023-05-25
- 中央企业7名管理人员接受纪律审查和监察调查-每日报道2023-05-25