Qt之tcp的简单使用
今天需要做一个服务器端的tcp通信
因为之前没有用过qt的方法,只用过C语言版本的,所以干脆客户端和服务器端都查了下,做个笔记。
先上代码
客户端.h
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTcpSocket>
#include <QHostAddress>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
客户端.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("192.168.0.109");ui->lineEdit_Port->setText("8088");}MainWindow::~MainWindow()
{delete this->socket;delete ui;
}void MainWindow::on_pushButton_Connect_clicked()
{if(ui->pushButton_Connect->text() == tr("connect")){int port;//获取端口号port = ui->lineEdit_Port->text().toInt();//取消已有的连接socket->abort();//连接服务器socket->connectToHost(ui->lineEdit_IP->text(), 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().toLocal8Bit());socket->flush();
}void MainWindow::socket_Read_Data()
{//读取缓冲区数据QByteArray buffer = socket->readAll();if(!buffer.isEmpty()){QString str = ui->textEdit_Recv->toPlainText().fromLocal8Bit(buffer);qDebug() << "recv data = " << str;//刷新显示ui->textEdit_Recv->setText(str);}
}void MainWindow::socket_Disconnected()
{//发送按键失能ui->pushButton_Send->setEnabled(false);//修改按键文字ui->pushButton_Connect->setText("连接");qDebug() << "Disconnected!";
}
服务端.h
#ifndef TCPSERVER_H
#define TCPSERVER_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>QT_BEGIN_NAMESPACE
namespace Ui { class TcpServer; }
QT_END_NAMESPACEclass TcpServer : public QWidget
{Q_OBJECTpublic:TcpServer(QWidget *parent = nullptr);~TcpServer();void setHostAddress(QString address){m_hostAddress=address;}void setTcpServerPort(int port){m_tcpServerPort=port;}protected slots:void server_New_Connect();void socket_Read_Data();void socket_Disconnected();private slots:void on_writeBtn_clicked();void on_setListen_clicked();void on_setAdd_clicked();void on_setPort_clicked();private:Ui::TcpServer *ui;QTcpServer* mServer;QTcpSocket* mSocket;QString m_hostAddress = "192.168.0.100";//"192.168.0.109";int m_tcpServerPort = 8000;//8080;
};
#endif // TCPSERVER_H
服务端.cpp
#include "tcpserver.h"
#include "ui_tcpserver.h"TcpServer::TcpServer(QWidget *parent): QWidget(parent), ui(new Ui::TcpServer)
{ui->setupUi(this);//1.创建一个tcpServer对象mServer = new QTcpServer(this);mSocket= new QTcpSocket;//2.监听一个端口,使得客户端可以使用这个端口访问服务器
// mServer->listen(QHostAddress::Any, 8080);//3.链接信号槽connect(mServer,&QTcpServer::newConnection,this,&TcpServer::server_New_Connect);
}TcpServer::~TcpServer()
{delete ui;
}void TcpServer::server_New_Connect()
{//获取客户端连接mSocket = mServer->nextPendingConnection();qDebug() << "A Client connect!";//连接QTcpSocket的信号槽,以读取新数据QObject::connect(mSocket, &QTcpSocket::readyRead, this, &TcpServer::socket_Read_Data);QObject::connect(mSocket, &QTcpSocket::disconnected, this, &TcpServer::socket_Disconnected);
}void TcpServer::socket_Read_Data()
{//读取缓冲区数据QByteArray buffer = mSocket->readAll();if(!buffer.isEmpty()){ui->recvData->clear();ui->recvData->setText(QString::fromLocal8Bit(buffer));}
}void TcpServer::socket_Disconnected()
{//发送按键失能qDebug() << "Disconnected!";
}void TcpServer::on_writeBtn_clicked()
{QString buf = "hello tcp " + ui->recvData->toPlainText();
// char *buffer = buf.toLatin1().data();mSocket->write(buf.toLocal8Bit());
// qDebug() << "server wirte buffer = " << buffer;mSocket->flush();
}void TcpServer::on_setListen_clicked()
{qDebug() << "start to listen";mServer->listen(QHostAddress::Any, 8088);
}void TcpServer::on_setAdd_clicked()
{setHostAddress("192.168.0.109");qDebug() << "set host address: " << "192.168.0.109";
}void TcpServer::on_setPort_clicked()
{setTcpServerPort(8088);qDebug() << "set host port: " << 8088;
}
因为只是做个demo,不需要太过细节,所以服务端返回的数据就是在收到客户端数据的基础上加了hello tcp;
这个demo只能做一个简单的小框架。
qt的封装,利用信号和槽使tcp通讯十分方便
客户端
- socket = new QTcpSocket();//申请socket对象
- socket->connectToHost(ip, port);//链接已经在监听的服务器ip和端口
- socket->write();//对已经socket写入数据
- QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);//如果服务器端发送过来数据,就会触发readyRead这个信号,我们在客户端只需要完成他的槽函数里面的操作即可,发送接收数据要注意数据格式,防止中文出现乱码
服务器
1.需要同时用到QTcpServer类和QTcpSocket mServer = new QTcpServer; mSocket= new QTcpSocket; 2.监听一个端口,使得客户端可以使用这个端口访问服务器mServer->listen(QHostAddress::Any, 8080);3.链接信号槽 connect(mServer,&QTcpServer::newConnection,this,&TcpServer::server_New_Connect);
当有用户链接进来,就会触发newConnection信号,我们只需要实现槽函数
4. mSocket = mServer->nextPendingConnection();//获取客户端连接
//连接QTcpSocket的信号槽,以读取新数据
QObject::connect(mSocket, &QTcpSocket::readyRead, this, &TcpServer::socket_Read_Data);QObject::connect(mSocket, &QTcpSocket::disconnected, this, &TcpServer::socket_Disconnected);5.read和write数据 和客户端一样
记录下吧,后面用到udp的时候,再写精致点
ps: 链接时不能开翻墙软件,否则链接失败
Qt之tcp的简单使用相关推荐
- 【QT实现TCP和UDP协议通信(一)】
QT实现TCP和UDP协议通信(一) 编程环境 :Windows10 x64 下 QtCreator 语言 :C++ 作者 :wddkxg 时间 :2022.4.24 项目 :Server + Cli ...
- linux系统下Qt应用程序重启,嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws)...
嵌入式Linux重启QT应用程序的简单办法(基于QT4.8 qws) 应用软件一般都有这样的业务需求: 当有新版本的APP,则程序就需要执行更新,更新完毕后(所谓的更新大多就是以覆盖的方式),不需要关 ...
- QT实现TCP网络通信
QT实现TCP网络通信 前言 一.目标 二.思路总览 服务器端主要代码 客户端主要代码 三.代码 客户端代码 mainwindow.h mainwindow.cpp mainwindow.ui 服务器 ...
- java 网络编程简单聊天_网络编程之 TCP 实现简单聊天
网络编程之 TCP 实现简单聊天 客户端 1.连接服务器 Socket 2.发送消息 package lesson02;import java.io.IOException;import java.i ...
- linux下TCP通信简单实例
linux下TCP通信简单实例 基于TCP(面向连接)的socket编程,分为服务器端和客户端 服务器端的流程如下: (1)创建套接字(socket) (2)将套接字绑定到一个本地地址和端口上(bin ...
- Qt 2D绘图功能简单总结
文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...
- Qt 多线程TCP服务端一键关闭所有客户端
Qt 多线程TCP服务端一键关闭所有客户端 任务描述: 实现多线程TCP服务端一键关闭所有客户端的连接. 解决过程: 1.Qt的服务端提供了close的功能,但是只用来不响应新接入的客户端. 手册中是 ...
- Qt下Tcp传输文件
Qt下Tcp传输文件 文章目录 Qt下Tcp传输文件 1.服务端 2.客户端 1.服务端 //ServerWidgets.h #ifndef SERVERWIDGET_H #define SERVER ...
- QT学习——Tcp客户端通信(本地回环)
1.Linux下Tcp通信 2.Qt下Tcp通信 1)Tcp框架--简图 下面的文本框是写入文本,上面的是显示发送后接收到的信息.这里发送的消息并不会立刻显示到界面上,而是要通过 readyRead( ...
最新文章
- 手把手教你 Socket 通信(TCP/IP)
- pygame两图层怎么搞_每天解决一个卖酒问题(176):小白怎么开拓市场?
- Eureka集群搭建
- 【2018.3.24】模拟赛之四-ssl2548 旋转【暴力模拟】
- SAP License:CO第一夜-成本要素会计
- web渗透测试思路浅谈-----漏洞发现及利用
- tts语音合成小玩具
- 蚁群算法最短路径规划多出口情况及问题答疑
- linux之终端的灵活使用。SCREEN
- RedHat7安装及小红帽硬盘分区建议
- 硬盘分区整数计算方法
- Python的学习笔记案例4--52周存钱挑战1.0
- linux怎么进入自己添加的软盘,linux – 创建没有mount的虚拟软盘映像?
- html5四季特点,成都气候:成都温度、成都天气、成都常年气温、成都四季特点,chengdu weather...
- orge,Nebula与klayGE对比
- 服务器文件夹只读属性去不掉,C# 去除文件或 文件夹只读属性
- RTT WK2412 spi-uart
- Python网络爬虫实战(一)快速入门
- STM32关于PVD低电压能检测的知识
- 抖音Vlog短视频达人必备2000+PR无缝转场过渡模板 全格式Premiere转场包
热门文章
- mybatis 之 parameterType=list1
- 报表性能优化方案之善用参数注入
- python学习笔记15-执行环境
- 分析:微软最终将赢得平板电脑市场的5个理由
- Miller_Rabin测试法
- javascript原生代码取单选框的值
- [MetalKit]7-Using-MetalKit-part-6使用MetalKit6
- 《实施Cisco统一通信管理器(CIPT1)》一2.2 CUCM:单站点部署模型
- 菜鸟学Linux 第030篇笔记 yum使用,源码编译安装
- 【服务器环境搭建-Centos】tmpfs,【转载】