QT示例:基于TCP点对点Socket通讯

QT示例:基于TCP点对点通讯

      • 一、 概述
      • 二、TCP 协议工作原理
      • 三、TCP 编程模型
      • 四、基于TCP点对点通讯示例
        • 1、客户端
        • 2、客户端Client示例
        • 3、服务器
        • 4、服务器server示例

下载:基于TCP点对点通讯

一、 概述

首先介绍一下TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。相比而言UDP,就是开放式、无连接、不可靠的传输层通信协议。

二、TCP 协议工作原理

在这里插入图片描述

三、TCP 编程模型

在这里插入图片描述

四、基于TCP点对点通讯示例

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 myWidget::socket_Read_Data()
{QByteArray buffer;//读取缓冲区数据buffer = socket->readAll();
}

5)断开与服务器的连接(关于close()和disconnectFromHost()的区别,可以按F1看帮助)

socket->disconnectFromHost();
socket->close();

2、客户端Client示例

.pro文件添加:

QT        +=network

myWidget.h 添加:

//#include <QtNetwork>
#include <QTcpSocket>
#include <QMessageBox>namespace Ui {
class myWidget;
}class myWidget : public QWidget
{Q_OBJECTpublic:explicit myWidget(QWidget *parent = 0);~myWidget();private slots:void on_pushButton_connect_clicked(); // 连接按钮void socket_Read_Data();	// 数据流读取void on_pushButton_send_clicked(); // 发送数据void socket_Disconnected();	// 连接中断
private:Ui::myWidget *ui;QTcpSocket *socket;QPalette Pal0,Pal1; // 调色板
};    

myWidget.cpp 添加:

#include "mywidget.h"
#include "ui_mywidget.h"myWidget::myWidget(QWidget *parent):QWidget(parent),ui(new Ui::myWidget)
{ui->setupUi(this);// 一、创建QTcpSocket套接字对象socket = new QTcpSocket;ui->pushButton_send->setEnabled(false);ui->lineEdit_IP->setText("192.168.1.100");ui->lineEdit_port->setText("8010");Pal0 =ui->pushButton_connect->palette();Pal1.setColor(QPalette::ButtonText,Qt::red); // 只能对按钮文本、窗口文本的动态颜色设置//连接信号槽QObject::connect(socket, &QTcpSocket::readyRead, this, &myWidget::socket_Read_Data);QObject::connect(socket, &QTcpSocket::disconnected, this, &myWidget::socket_Disconnected);
}myWidget::~myWidget()
{delete this->socket;delete ui;
}// 二、连接服务器
void myWidget::on_pushButton_connect_clicked()
{if(ui->pushButton_connect->text() == tr("连接")){//获取IP地址QString IP = ui->lineEdit_IP->text();//获取端口号int port = ui->lineEdit_port->text().toInt();//取消已有的连接socket->abort();//连接服务器(使用socket对象连接服务器)socket->connectToHost(IP, port);//等待连接成功if(!socket->waitForConnected(30000)){QMessageBox::information(this,tr("提示"),tr("Connection failed!"),QMessageBox::Ok);return;}QMessageBox::information(this,tr("提示"),tr("Connect successfully!"),QMessageBox::Ok);// 更新界面ui->pushButton_send->setEnabled(true);ui->pushButton_connect->setText("断开连接");ui->pushButton_connect->setPalette(Pal1);}else{//断开连接socket->disconnectFromHost();socket->close();// 更新界面ui->pushButton_send->setEnabled(false);ui->pushButton_connect->setText("连接");ui->pushButton_connect->setPalette(Pal0);}
}// 三、接受/读取数据:使用socket的write函数向客户端发送数据
void myWidget::socket_Read_Data()
{// 读取缓冲区数据QByteArray buffer= socket->readAll();if(!buffer.isEmpty()){QString str =ui->textEdit_receive->toPlainText();str += buffer+"\n";// 刷新显示接受到的数据ui->textEdit_receive->setText(str);}
}// 四、发送按钮:使用socket的write函数向客户端发送数据
void myWidget::on_pushButton_send_clicked()
{//获取文本框内容并以ASCII码形式发送socket->write(ui->textEdit_send->toPlainText().toLatin1());socket->flush();    // 冲掉 缓存
}// 五、断开连接
void myWidget::socket_Disconnected()
{ui->pushButton_send->setEnabled(false);QMessageBox::information(this, tr("提示"),tr("Disconnected!"), QMessageBox::Ok);
}

界面:
在这里插入图片描述

3、服务器

二、服务器

服务器使用到了QTcpSocket类和QTcpSever类。用到了6个步骤:
1)创建QTcpSever对象

server = new QTcpServer();

2)侦听一个端口,使得客户端可以使用这个端口访问服务器

server->listen(QHostAddress::Any, port)

3)当服务器被客户端访问时,会发出newConnection()信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问

connect(server,&QTcpServer::newConnection,this,&mywidget::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();

4、服务器server示例

.pro文件添加:

QT        +=network

myWidget.h 添加:

//#include <QtNetwork>
#include <QTcpServer>
#include <QTcpSocket>
#include <QMessageBox>namespace Ui {
class myWidget;
}class myWidget : public QWidget
{Q_OBJECTpublic:explicit myWidget(QWidget *parent = 0);~myWidget();private slots:void server_New_Connect();void socket_Read_Data();void socket_Disconnected();void on_pushButton_listen_clicked();void on_pushButton_send_clicked();private:Ui::myWidget *ui;
private:QTcpServer  *server;QTcpSocket *socket;QPalette Pal0,Pal1; 	// 调色板bool socket_IsConnected =false ;};    

myWidget.cpp 添加:

#include "mywidget.h"
#include "ui_mywidget.h"myWidget::myWidget(QWidget *parent):QWidget(parent),ui(new Ui::myWidget)
{ui->setupUi(this);ui->lineEdit_port->setText("8010");ui->lineEdit_ip->setText(QNetworkInterface().allAddresses().at(1).toString());   //获取本地IPui->lineEdit_ip->setEnabled(false);                     // 只能用主机IP 作为服务端ui->pushButton_send->setEnabled(false);Pal0=ui->pushButton_listen->palette();Pal1.setColor(QPalette::ButtonText,Qt::red);  // 此方式 只能对按钮文本、窗口文本的动态颜色设置// 一 、创建QTcpSever对象;server = new QTcpServer();//连接信号槽(服务端被访问时,自动触发newconnection 信号,绑定槽函数 server new connect)connect(server,&QTcpServer::newConnection,this,&myWidget::server_New_Connect);}myWidget::~myWidget()
{server->close();server->deleteLater();delete ui;
}// 二、监听按钮:监听端口
void myWidget::on_pushButton_listen_clicked()
{if(ui->pushButton_listen->text()==tr("开始监听")){// 1.获取端口号QHostAddress IP(ui->lineEdit_ip->text());   // 服务器IPint port = ui->lineEdit_port->text().toInt();// 2.监听指定的端口(主机地址)if(!server->listen(IP,port)){// 若出错,则输出错误信息QMessageBox::warning(this, tr("错误"),tr("监听失败!"), QMessageBox::Ok);return;}ui->pushButton_listen->setText("取消监听"); // 修改键文字ui->pushButton_listen->setPalette(Pal1);// ui->pushButton_listen->setStyleSheet("background-color:rgb(255,255,0)"); // 改变按钮背景颜色}else{//if(socket->state() == QAbstractSocket::ConnectedState) // 若socket没有指定对象会有异常if(socket_IsConnected){//关闭连接socket->disconnectFromHost();socket_IsConnected =false;}// 4.关闭服务端server->close();QMessageBox::information(this, tr("提示"),tr("已取消监听"), QMessageBox::Ok);// 更新界面ui->pushButton_listen->setText("开始监听");ui->pushButton_listen->setPalette(Pal0);ui->pushButton_send->setEnabled(false);}
}// 三、建立新连接(当服务器接收到客户端信号时)
void myWidget::server_New_Connect()
{//获取客户端连接(获得连接过来的客户端信息)socket = server->nextPendingConnection();//连接QTcpSocket的信号槽,以读取新数据(服务器接收到客户端数据后,自动触发 readyRead 信号)QObject::connect(socket, &QTcpSocket::readyRead, this, &myWidget::socket_Read_Data);// 关闭连接(客户端断开连接后,自动触发 disconnect 信号)QObject::connect(socket, &QTcpSocket::disconnected, this, &myWidget::socket_Disconnected);ui->pushButton_send->setEnabled(true);QMessageBox::information(this,tr("提示"),tr("A Client connect!"),QMessageBox::Ok);socket_IsConnected= true;
}
// 四、接受/读取数据:使用socket的write函数向客户端发送数据
void myWidget::socket_Read_Data()
{// 读取缓冲区数据QByteArray buffer= socket->readAll();if(!buffer.isEmpty()){QString str =ui->textEdit_receive->toPlainText();str +=buffer+"\n";// 刷新显示接受到的数据ui->textEdit_receive->setText(str);}
}// 五、发送按钮:使用socket的write函数向客户端发送数据
void myWidget::on_pushButton_send_clicked()
{//获取文本框内容并以ASCII码形式发送(Latin1 编码规范)socket->write(ui->textEdit_send->toPlainText().toLatin1());socket->flush();
}// 六、断开连接
void myWidget::socket_Disconnected()
{ui->pushButton_send->setEnabled(false);QMessageBox::information(this, tr("提示"),tr("Disconnected!"), QMessageBox::Ok);
}

界面:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

50 年人类登月史:那些不为人知的故事

来源&#xff1a; CSDN2019年7月20日是纪念人类登月五十周年的好日子。人类于1969年首次正式登上月球&#xff0c;历史将永远铭记两位宇航员的名字&#xff1a;尼尔阿姆斯特朗与巴兹奥尔德林。 然后&#xff0c;这背后还有很多不为人知的故事。 在我们庆祝首次登月成功的同时&a…

物理学走到尽头了吗 | 维尔切克专栏

来源&#xff1a;环球科学撰文 | 弗兰克维尔切克&#xff08;Frank Wilczek&#xff09;翻译 | 胡风 梁丁当“物理学家沉迷于追求数学的优美&#xff0c;却正在丧失解决新问题的能力。” “顶级的物理学家不再关心物理现实——当然他们也不用关心这些。” “科学完了。”这几句…

C# “配置系统未能初始化” 异常解决

使用App.config配置参数&#xff0c;读取参数出现错误 “System.Configuration.ConfigurationErrorsException”类型的未经处理的异常在 System.Configuration.dll 中发生 其他信息: 配置系统未能初始化 验证App.config文件没有结构错误 解决办法&#xff1a; 如果配置文件中包…

从零到无穷——美国数学的崛起之路

来源&#xff1a;今日头条从十七世纪开始&#xff0c;大批各种各样的欧洲移民开始涌入北美新大陆&#xff0c;也是从这个时候开始&#xff0c;科技革命的号角在欧洲开始吹响。但在相当长的一段时间内&#xff0c;北美大陆的居民仍在为生存而挣扎&#xff0c;像数学这样的科学在…

IAR STM32报错Error[Pe147]:declaration is incompatible with“__nounwind __interwork __softfp unsigned

IAR STM32工程中报错&#xff1a; Error[Pe147]: declaration is incompatible with "__nounwind __interwork __softfp unsigned int __iar_builtin_REV16(unsigned int)" (declared at line 197 of "D:\STM32F103_Demo\Core\core_cm3.h 解决方法&#xff1…

JAVA设计模式之工厂模式

在面向对象编程中&#xff0c; 最通常的方法是一个new操作符产生一个对象实例&#xff0c;new操作符就是用来构造对象实例的。但是在一些情况下&#xff0c;new操作符直接生成对象会带来一些问题。举例来说&#xff0c;许多类型对象的创造需要一系列的步骤&#xff1a;你可能需…

纳米片晶体管是摩尔定律的下一步,也许是最后一步!

来源&#xff1a;云头条作者&#xff1a;Peide Ye是普渡大学的Richard J.和Mary Jo Schwartz电气与计算机工程教授&#xff0c;Thomas Ernst是法国格勒诺布尔CEA-Leti的科学主任&#xff0c;Mukesh V. Khare是IBM研究中心的半导体和AI硬件副总裁。纳米片器件计划最快在2021年用…

IAR STM32工程报错Error[Pe020]: identifier “GPIO_Pin_0”is undefined D:\STM32F103_Demo\App\main.c

IAR STM32工程报错&#xff1a; Error[Pe020]: identifier "GPIO_Pin_0" is undefined D:\STM32F103_Demo\App\main.c 解决方法&#xff1a; 右键下图工程名选择Options 在预处理里面加上下面这行

脑机接口技术的现状与未来!

来源&#xff1a;芯智讯一、前言通过在脑后插入一根线缆&#xff0c;我们就能够畅游计算机世界&#xff1b;只需一个意念我们就能改变“现实”&#xff1b;学习知识不再需要通过书本、视频等媒介&#xff0c;也不需要在花费大量的时间&#xff0c;只需直接将知识传输到大脑当中…

学籍管理系统系统流程图

转载于:https://www.cnblogs.com/whitelip/p/5406976.html

崛起的超级智能:是否会是下一个“麦克卢汉式”预言?

腾讯科技21世纪以来&#xff0c;前沿科技领域呈爆发式增长&#xff1a;从云计算到区块链、从谷歌大脑到华为EI智能体、从工业大脑到农业大脑、从城市神经网络到智慧社会……各种新技术和新概念层出不穷&#xff0c;如潮水般不断涌现&#xff0c;无论业界学界还是行业产业&#…

HttpClient Get/Post方式调用Http接口

HttpClient Get/Post方式调用Http接口 本节摘要:本节主要分别介绍如何用get方式、post方式向http接口发送数据。 preparation 1. 项目环境如下&#xff1a; myeclipse6.5 、tomcat5.0、system:xp、JDK:开发1.5&#xff0c;编译1.4 为了方便,在原来的web项目UpDown中新建了一个h…

python对Excel的操作 xlrd、xlwt包详解

文章更新中............. python中对Excel表格的操作&#xff0c;主要用到两个包&#xff0c;分别是xlrd和xlwt 1.xlrd主要用于读Excel表 2.xlwt则主要用于写Excel python—xlrd 这里我先准备了一些济南天气的一些数据通过python程序先对数据有一个基本的了解&#xff1a; path…

人造细胞能模仿天然细胞感知环境

来源&#xff1a;科技日报据英国帝国理工学院官网近日消息&#xff0c;该校一个研究团队成功开发出一种新型人造细胞&#xff0c;能够模仿天然细胞感知环境中的化学变化并产生反应。如果在未来发展成熟&#xff0c;这项技术可广泛用于生物科技等领域。相关成果已刊登在近期美国…

FileNotFoundError: [Errno 2] No such file or directory: 'test/条形图03.html'

这几天一直在搞百度的一个可视化的工具Echart&#xff0c;感觉确实挺不错的&#xff0c;比matplotlib的可视化好看多了。 今天遇到了两个问题 1、如何导入pyecharts中的get_all_options工具 解决方法&#xff1a; from pyecharts.echarts.option import get_all_options 2、在进…

感觉皮层实质性参与工作记忆的信息保存

来源&#xff1a;脑智卓越创新中心7月17日&#xff0c;《eLife》期刊在线发表了题为《感觉皮层实质性参与工作记忆的信息保存》的研究论文。该研究由中国科学院脑科学与智能技术卓越创新中心&#xff08;神经科学研究所&#xff09;、上海脑科学与类脑研究中心、神经科学国家重…

孙正义看科技未来:今后30年要把钱和精力投向哪里

来源&#xff1a;dang归网孙正义&#xff0c;软银集团创办人对于今后30年来讲&#xff0c;我认为现在个很关键的时刻&#xff0c;尤其是在各位的人生当中。而且现在是一整个概念的转变&#xff0c;我们要包容这个概念的转变&#xff0c;我想先给大家看两张照片。这是美国纽约的…

python+OpenCV图像处理(一)读取、复制、显示、保存

前 言 从2017年入坑人工智能领域开始&#xff0c;就被这一领域深深的所吸引&#xff0c;虽然到现在已经踩了不少坑&#xff0c;但总算有了不少的收获&#xff0c;深感不虚此行&#xff0c;借助强大的python让我快速的向着这一领域靠近&#xff0c;现在流行比较广的人工智能应用…

python+OpenCV图像处理(二)图像像素的访问、通道的合并与分离

图像像素的访问、通道的合并与分离 &#xff08;一&#xff09;像素访问 在第一篇博客中&#xff0c;向大家介绍了&#xff0c;所谓的图像在计算机看来就是一个矩阵&#xff0c;对于RGB图像矩阵一共有三层&#xff0c;分别代表着RGB通道&#xff0c;矩阵中每一个数的大小代表着…

PNG转EPS格式

由于使用LaTeX需要将png格式转为eps格式&#xff0c;如果电脑装了tex软件&#xff0c;则转换方式很简单&#xff1a; 首先打开需要转换的图片所在文件夹。在地址栏输入cmd&#xff1a; 此时会弹出&#xff0c;命令窗口&#xff0c;然后输入bmeps -c Figure1.png Figure1.eps 即…