qt网络编程笔记
2021/8/3 12:05:49
本文主要是介绍qt网络编程笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
qt网络编程笔记
前言:这篇笔记是本人在学习qt的网络编程时写的,由于本人没有任何网络编程基础,在这之前也不知道ip,tcp,udp的意思,书上给出的函数不知道怎么用,所以就去找了几个实例大致了解了一下这些东西
TCP:网络传输协议的一种,特点时传输不容易出错,传输文本用的就是这种协议,下面用的是TCP
UDP:同上,传输速度比TCP快但是容易丢失字节,传输视频用的就是这种协议
IP:在网络数据传输中电脑的代号
端口:可以理解为用于找到对应的软件的门,因为数据传输过去后并不知道应该传给哪个软件
基本原理:
在socket编程中,客户端(比如你的手机)与服务端(比如服务器)之间的数据传输是靠socket()实现的。服务端的实现主要有如下几个步骤
-
创建socket
-
将socket与指定的ip和端口绑定(bind())
-
让socket在绑定的端口处监听请求(listen())
-
客户端成功连接服务端(accept()),服务端收到客户端的套接字,套接字是客户端与服务端进行数据传输的媒介,每个客户端对应一个套接字
-
接受数据(recv())
-
发送数据(send())
-
断开连接(close())
有了以上的理念之后剩下的就是如何用qt来实现了
首先要在生成的pro文件的qt模块那一行加上newwork
QT += core gui network
然后在头文件中加入下面两个头文件
#include<QTcpServer> #include<QTcpSocket>
在qt中,QTcpServer用于生成一个服务器对象,相当于上面的socket对象.
QTcpServer * server = new QTcpServer;
接下来就是bind()和listen()操作
connect(server,&QTcpServer::newConnection,this,[](){ //对信号的处理 }); //在有新的客户端连接时会发送slo_newConnection的信号,这是qt需要额外做的一步 server->listen(QHostAddress::Any,5555);//绑定和监听对应的端口,通过返回值查看成功与否
然后是生成和处理套接字
QTcpSocket * socket=server->nextPendingConnection();//在客户端连接上来时成为处理数据的套接字
套接字的读写数据用的是以下两个函数
write(const char *data); readAll();//
于是全部的代码如下
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QTcpSocket> #include<QTcpServer> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private slots: void slo_new();//用于对新连接的客户端响应的槽 void slo_dis();//用于对客户端断开连接相应的槽 void slo_rec();//接受消息 void on_pushButton_clicked();//与按钮关联用于发送消息 private: Ui::Widget *ui; void showmessage(const QString &);//及时更新消息到屏幕上 QTcpServer * server; QList<QTcpSocket*> list_sokets;//用于保存所有用户对应的socket,用qobject_cast方法来找到是哪个socket发送的信号 }; #endif // WIDGET_H
widget.cpp
#include "widget.h" #include "ui_widget.h" #include<QDateTime> #include<QPushButton> #include<QHostAddress> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); server=new QTcpServer;//新建一个服务器对象 server->listen(QHostAddress::Any,6666);//监听对应的id和6666端口 connect(server,&QTcpServer::newConnection,this,&Widget::slo_new);//有新客户端连接将发出newconnection的信号 } void Widget::showmessage(const QString & str2) { QString str=QDateTime::currentDateTime().toString(); ui->textEdit->append(str+' '+str2); } void Widget::slo_new() { QTcpSocket * socket=server->nextPendingConnection();//读取新客户端对应的套接字 connect(socket,&QTcpSocket::readyRead,this,&Widget::slo_rec);//关联读取信息的槽 connect(socket,&QTcpSocket::disconnected,this,&Widget::slo_dis);//关联客户端断开的槽 showmessage(QString::fromUtf8("新用户%1连接").arg(socket->peerAddress().toString())); list_sokets<<socket; } void Widget::slo_dis() { QTcpSocket * socket=qobject_cast<QTcpSocket*>(QObject::sender());//获取发送信号的socket showmessage(QString::fromUtf8("用户%1断开").arg(socket->peerAddress().toString())); list_sokets.removeOne(socket);//将这个socket从列表移除 socket->disconnect(socket,0,this,0);//断开连接 socket->deleteLater(); } void Widget::slo_rec() { QTcpSocket * socket=qobject_cast<QTcpSocket*>(QObject::sender());//获取发送信号的socket QString str=QString::fromUtf8(socket->readAll());//读取消息 showmessage(socket->peerAddress().toString()+":\n"+str); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_clicked() { if(list_sokets.isEmpty()) { showmessage("没人"); return ; } for(auto socket :list_sokets) { socket->write(ui->lineEdit->text().toUtf8()); } }
客户端的搭建要简单一些
-
创建socket
-
连接服务端
-
收发消息
-
断开连接
代码如下
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QTcpServer> #include<QTcpSocket> #include<QHostAddress> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); void showmessage(const QString &);//及时更新消息到屏幕上 public slots: void slo_rec();//接受消息 private slots: void on_pushButton_2_clicked(); void on_pushButton_clicked(); private: Ui::Widget *ui; QTcpSocket * socket; }; #endif // WIDGET_H
widget.cpp
#include "widget.h" #include "ui_widget.h" #include<QString> #include<QDateTime> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); socket = new QTcpSocket; } Widget::~Widget() { delete ui; socket->close(); } void Widget::on_pushButton_2_clicked()//连接服务端 { socket->connectToHost(QHostAddress::LocalHost,6666);//第一个参数为本地主机地址 if(QTcpSocket::UnconnectedState==socket->state()) { showmessage(QString::fromUtf8("连接失败")); return ; } else showmessage(QString::fromUtf8("连接成功")); connect(socket,&QTcpSocket::readyRead,this,&Widget::slo_rec);//关联服务端来接受新信息 } void Widget::slo_rec() { showmessage(QString::fromUtf8(socket->readAll())); } void Widget::showmessage(const QString & str2) { QString str=QDateTime::currentDateTime().toString(); ui->textEdit->append(str+' '+str2); } void Widget::on_pushButton_clicked() { socket->write(ui->lineEdit->text().toUtf8()); }
-
这篇关于qt网络编程笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南