QT网络通信-服务器(一)

简介: QT网络通信-服务器(一)

1、简介

网络有TCP和UDP。本文主要通过QT完成TCP网络设计,通过ESP8266与单片机进行通讯。


2 、TCP通信流程


ea53af1dc1c447f8bacea0e18b017ad4.png


3、基于TCP通信所需要的类

QTcpSever 服务器类,用于监听客户端连接以及和客户端建立连接。


QTcpSocket 通信的套接字类,客户端、服务器端都需要使用。


QTcpSever、QTcpSocket都属于网络模块network。


4、QT端设计

4.1项目建立

1、


24d869ace2a249e9b4aa2d8c908260ae.png


2、


a5989c58c6be4d2a805c61bbb6dce6da.png


3、


73601ba7a4e04646881610797b7955fb.png


4、


e800cef63e2d4433906b1e8d6f3f926b.png


5、


d954873bdb764cdca0b12ed92073b102.png


6、


0da5dda738e842be8c4de2505702882b.png


7、


5ebfc9f3cd2e486bb5c64be296467ce7.png


4.2 TCP网络程序设计

QT提供了QTcpServer类,可以直接实例化一个客户端,可在help中索引如下:

The QTcpServer class provides a TCP-based server. More...
Header:     #include <QTcpServer> 
qmake:      QT += network
Inherits:       QObject

首先在在.pro文件中添加QT += network才可以进行网络编程



QT       += core gui network

接着在widget.h中添加所需头文件,头文件如下所示:

#include <QTcpServer>
#include <QTcpSocket>
#include <QNetworkInterface>

4.2.1 QT界面设计

如下所示:

1、



2、



3、



4、



5、



6、



4.2.2 UI布局



整体垂直布局



对于接收框设置成只读,如下所示:



4.2.3 控件重命名


5、widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QNetworkInterface>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
    QTcpServer *tcpserver;//声明一个QTcpserver的对象,用于监听
    QTcpSocket *tcpsocket;//创建服务器的套接字,用于与客户端进行通信
private slots:
    void newConnection_Slot();
    void readyRead_Slot();
    void on_open_Button_clicked();
    void on_close_Button_clicked();
    void on_send_Button_clicked();
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H


6、widget.c

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    tcpserver = new QTcpServer(this);
    tcpsocket = new QTcpSocket(this);
    //当服务器发现有人要来连接时,就会发出newconnection 的信号,从而触发槽函数newConnection_Slot()(自行编写的槽函数)
    connect(tcpserver,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));
}
//建立接收客户端连接的槽函数,有人连接就触发这个槽函数
void Widget::newConnection_Slot()
{
     //获取这个服务器sserver与客户端通信的套接字
    tcpsocket = tcpserver->nextPendingConnection();
    connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));
}
void Widget::readyRead_Slot()
{
    QString buf;
    buf = tcpsocket->readAll();
    ui->rece_Edit->appendPlainText(buf);
}
Widget::~Widget()
{
    delete ui;
}
void Widget::on_open_Button_clicked()
{
    //服务端点击启动服务器,服务器就开始监听
    //监听----------启动服务器
    //QHostAddress::Any 地址,接纳所有的地址
    //端口号  ui->sportEdit->text()获得输入的字符串,转换成无符号短整型
    tcpserver->listen(QHostAddress::Any,ui->port_line->text().toUShort());
}
void Widget::on_close_Button_clicked()
{
    tcpserver->close();
}
void Widget::on_send_Button_clicked()
{
    tcpsocket->write(ui->send_line->text().toLocal8Bit().data());
}
相关文章
|
1月前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
2天前
|
监控 Linux 测试技术
LabVIEW网络服务器何使用,有哪些不同
LabVIEW网络服务器何使用,有哪些不同
|
1天前
|
网络协议
LabVIEW中如何在网络上使用远程VI服务器
LabVIEW中如何在网络上使用远程VI服务器
|
3天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
9 0
|
12天前
|
存储 数据处理 数据库
|
14天前
|
存储 缓存 网络协议
【专栏】理解并优化DNS设置对于提高网络速度至关重要
【4月更文挑战第28天】本文探讨了DNS服务器是否能加快网络访问速度。DNS负责将域名转换为IP地址,其查询时间、缓存机制和地理位置都影响网络速度。优化DNS配置,如选择快速的公共DNS服务、使用附近的服务器、确保设备正确配置和利用DNS缓存,都能有效提升网络体验。理解并优化DNS设置对于提高网络速度至关重要。
|
15天前
|
监控 负载均衡 网络协议
|
1月前
|
算法 测试技术 C#
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(三)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(二)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目
|
1月前
|
人工智能 BI 测试技术
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(一)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目

推荐镜像

更多