linux系统中如何使用QT来进行网络编程实现

简介: linux系统中如何使用QT来进行网络编程实现

第一:网络编程基本简介

       要想在程序中使用QT网络模块,需要在pro项目配置文件里增加下面的一条;

QT += network

第二:TCP通信简介

     TCP 协议(Transmission Control Protocol)全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。

      TCP 通信必须先建立 TCP 连接,通信端分为客户端和服务端。服务端通过监听某个端口来监听是否有客户端连接到来,如果有连接到来,则建立新的 socket 连接;客户端通过 ip 和port 连接服务端,当成功建立连接之后,就可进行数据的收发了。需要注意的是,在 Qt 中,Qt 把 socket 当成输入输出流来对待的,数据的收发是通过 read()write()来进行的,需要与我 们常见的send()recv()进行区分。

第三:TCP服务器端代码具体实现

       本例大体流程首先获取本地 IP 地址。创建一个 tcpSocket 套接字,一个 tcpServer 服务端。点击监听即监听本地的主机 IP 地址和端口,同时等待服务端的连接。此程序需要结合客户端一起使用。

1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QTcpServer>
6 #include <QTcpSocket>
7 #include <QVBoxLayout>
8 #include <QHBoxLayout>
9 #include <QPushButton>
10 #include <QTextBrowser>
11 #include <QLabel>
12 #include <QComboBox>
13 #include <QSpinBox>
14 #include <QHostInfo>
15 #include <QLineEdit>
16 #include <QNetworkInterface>
17 #include <QDebug>
18
19 class MainWindow : public QMainWindow
20 {
21 Q_OBJECT
22
23 public:
24 MainWindow(QWidget *parent = nullptr);
25 ~MainWindow();
26
27 private:
28 /* tcp 服务器 */
29 QTcpServer *tcpServer;
30
31 /* 通信套接字 */
32 QTcpSocket *tcpSocket;
33
34 /* 按钮 */
35 QPushButton *pushButton[4];
36
37 /* 标签文本 */
38 QLabel *label[2];
39
40 /* 水平容器 */
41 QWidget *hWidget[3];
42
43 /* 水平布局 */
44 QHBoxLayout *hBoxLayout[3];
45
46 /* 垂直容器 */
47 QWidget *vWidget;
48
49 /* 垂直布局 */
50 QVBoxLayout *vBoxLayout;
51
52 /* 文本浏览框 */
53 QTextBrowser *textBrowser;
54
55 /* 用于显示本地 ip */
56 QComboBox *comboBox;
57
58 /* 用于选择端口 */
59 QSpinBox *spinBox;
60
61 /* 文本输入框 */
62 QLineEdit *lineEdit;
63
64 /* 存储本地的 ip 列表地址 */
65 QList<QHostAddress> IPlist;
66
67 /* 获取本地的所有 ip */
68 void getLocalHostIP();
69
70 private slots:
71 /* 客户端连接处理槽函数 */
72 void clientConnected();
73
74 /* 开始监听槽函数 */
75 void startListen();
76
77 /* 停止监听槽函数 */
78 void stopListen();
79
80 /* 清除文本框时的内容 */
81 void clearTextBrowser();
82
83 /* 接收到消息 */
84 void receiveMessages();
85
86 /* 发送消息 */
87 void sendMessages();
88
89 /* 连接状态改变槽函数 */
90 void socketStateChange(QAbstractSocket::SocketState);
91 };
92 #endif // MAINWINDOW_H

第四:源文件mainwindow.cpp的具体实现

1 #include "mainwindow.h"
2 
3 MainWindow::MainWindow(QWidget *parent)
4 : QMainWindow(parent)
5 {
6 /* 设置主窗体的位置与大小 */
7 this->setGeometry(0, 0, 800, 480);
8 
9 /* 实例化 tcp 服务器与 tcp 套接字 */
10 tcpServer = new QTcpServer(this);
11 tcpSocket = new QTcpSocket(this);
12
13 /* 开始监听按钮 */
14 pushButton[0] = new QPushButton();
15 /* 停止监听按钮 */
16 pushButton[1] = new QPushButton();
17 /* 清空聊天文本按钮 */
18 pushButton[2] = new QPushButton();
19 /* 发送消息按钮 */
20 pushButton[3] = new QPushButton();
21
22 /* 水平布局一 */
23 hBoxLayout[0] = new QHBoxLayout();
24 /* 水平布局二 */
25 hBoxLayout[1] = new QHBoxLayout();
26 /* 水平布局三 */
27 hBoxLayout[2] = new QHBoxLayout();
28 /* 水平布局四 */
29 hBoxLayout[3] = new QHBoxLayout();
30
31 /* 水平容器一 */
32 hWidget[0] = new QWidget();
33 /* 水平容器二 */
34 hWidget[1] = new QWidget();
35 /* 水平容器三 */
36 hWidget[2] = new QWidget();
37
38 vWidget = new QWidget();
39 vBoxLayout = new QVBoxLayout();
40
41 /* 标签实例化 */
42 label[0] = new QLabel();
43 label[1] = new QLabel();
44
45 lineEdit = new QLineEdit();
46 comboBox = new QComboBox();
47 spinBox = new QSpinBox();
48 textBrowser = new QTextBrowser();
49
50 label[0]->setText("监听 IP 地址:");
51 label[1]->setText("监听端口:");
52
53 /* 设置标签根据文本文字大小自适应大小 */
54 label[0]->setSizePolicy(QSizePolicy::Fixed,
55 QSizePolicy::Fixed);
56 label[1]->setSizePolicy(QSizePolicy::Fixed,
57 QSizePolicy::Fixed);
58
59 /* 设置端口号的范围,注意不要与主机的已使用的端口号冲突 */
60 spinBox->setRange(10000, 99999);
61
62 pushButton[0]->setText("开始监听");
63 pushButton[1]->setText("停止监听");
64 pushButton[2]->setText("清空文本");
65 pushButton[3]->setText("发送消息");
66
67 /* 设置停止监听状态不可用 */
68 pushButton[1]->setEnabled(false);
69
70 /* 设置输入框默认的文本 */
71 lineEdit->setText("www.openedv.com 正点原子论坛");
72
73 /* 水平布局一添加内容 */
74 hBoxLayout[0]->addWidget(pushButton[0]);
75 hBoxLayout[0]->addWidget(pushButton[1]);
76 hBoxLayout[0]->addWidget(pushButton[2]);
77
78 /* 设置水平容器一的布局为水平布局一 */
79 hWidget[0]->setLayout(hBoxLayout[0]);
80
81 /* 水平布局二添加内容 */
82 hBoxLayout[1]->addWidget(label[0]);
83 hBoxLayout[1]->addWidget(comboBox);
84 hBoxLayout[1]->addWidget(label[1]);
85 hBoxLayout[1]->addWidget(spinBox);
86
87 /* 设置水平容器二的布局为水平布局二 */
88 hWidget[1]->setLayout(hBoxLayout[1]);
89
90 /* 水平布局三添加内容 */
91 hBoxLayout[2]->addWidget(lineEdit);
92 hBoxLayout[2]->addWidget(pushButton[3]);
93
94 /* 设置水平容器三的布局为水平布局一 */
95 hWidget[2]->setLayout(hBoxLayout[2]);
96
97 /* 垂直布局添加内容 */
98 vBoxLayout->addWidget(textBrowser);
99 vBoxLayout->addWidget(hWidget[1]);
100 vBoxLayout->addWidget(hWidget[0]);
101 vBoxLayout->addWidget(hWidget[2]);
102
103 /* 设置垂直容器的布局为垂直布局 */
104 vWidget->setLayout(vBoxLayout);
105
106 /* 居中显示 */
107 setCentralWidget(vWidget);
108
109 /* 获取本地 ip */
110 getLocalHostIP();
111
112 /* 信号槽连接 */
113 connect(pushButton[0], SIGNAL(clicked()),
114 this, SLOT(startListen()));
115 connect(pushButton[1], SIGNAL(clicked()),
116 this, SLOT(stopListen()));
117 connect(pushButton[2], SIGNAL(clicked()),
118 this, SLOT(clearTextBrowser()));
119 connect(pushButton[3], SIGNAL(clicked()),
120 this, SLOT(sendMessages()));
121 connect(tcpServer, SIGNAL(newConnection()),
122 this, SLOT(clientConnected()));
123 }
124
125 MainWindow::~MainWindow()
126 {
127 }

总结:QT中有丰富的C++接口函数,利用好这些接口函数可以实现各种各样的功能,各位开发者可以根据自己的实际需求进行学习。

目录
相关文章
|
24天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
64 3
|
24天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
60 2
|
18天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
15 3
|
24天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
67 3
|
24天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
64 3
|
27天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
43 6
|
27天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
65 6
|
24天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
72 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
191 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
4月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
97 0