本文主要介绍了网络编程在Qt中的实现,并通过实例代码进行了详细介绍。对大家的学习或工作都有一定的参考价值。有需要的朋友下面和边肖一起学习。
: 目录
1.tcp/IP协议簇相关udp 1,tcp/IP协议族2,udp3,常用通信协议概述2。Qt中的TCP(这里只显示代码)1,tcpsever2,tcpclient 3,QT中的Udp。由于我没有系统的分享一些简单的计算机网络,这里只是简单的说一下tcp/ip协议簇和udp。
一、tcp/IP协议簇与udp
1、TCP/IP协议族TCP/IP实际上是一个协作通信家族,为网络通信提供了一个通道。为了便于讨论TCP/IP协议族,它大致分为三个部分:
互联网协议(IP)。
传输控制协议(TCP)和用户数据报协议(UDP)。
TCP和UDP之上的一套应用协议。它们包括远程登录、文件传输协议(FTP)、域名服务协议(DNS)和简单邮件传输程序(SMTP)。
2、udpUdp协议(用户数据报协议),与TCP协议完全相反。提供不可靠、无连接和基于数据报的服务。不可靠是指UDP协议不能保证数据从发送方正确传输到接收方。如果中途数据丢失,或者目的地通过数据校验发现数据错误并丢弃,UDP协议的应用通常要处理数据确认、超时重传等逻辑。
3、常用的通讯协议小结1.3.1、tcp/ip
Tcp只需要知道它是一种通信方式,有一个udp,那么这两者是什么关系。TCP/IP协议是一个协议簇。里面有很多协议。UDP只是其中之一。之所以命名为tcp/IP,是因为tcp和IP是两个非常重要的协议,所以以它们命名。TCP,IP用于打电话,udp用于发送短信。
Ip(网络间互联的协议,外文是Internet Protocol的缩写,中文缩写是“互联网协会”。缩写为ip),可以通过设置ip地址来访问网络。最常用的IP协议是IP v4(IP协议v4版),还有一个版本是ipv6,这还不够。Ipv4版本是32位,一般分为4段。内存是无符号的32位整数,ipv6是64位整数。可以通过位数知道ipv4和ipv6的区别,可以节省多少地址。但是用户不需要去发现。
现在常用的ip是127.0.0.1,点格式(一个字符串)。由点分隔的间隔是一个字符。Ip地址有ABC三种地址类型。前三段用于确定路由器,即主机连接到外围网络的路由,最后一段用于确定该路由器上的主机和主机数量,最多255台。0通常用作网关。
还有一个子网掩码对应ip。
子网掩码又称网络掩码、地址掩码和子网掩码,是一种位掩码,用来表示IP地址的哪些位标识主机所在的子网,哪些位标识主机。子网掩码不能单独存在;它必须与IP地址一起使用。子网掩码只有一个作用,就是把一个IP地址分成两部分:网络地址和主机地址。子网掩码-屏蔽IP地址网络部分的“全1”位模式。
对于A类地址,默认子网掩码是255 . 0 . 0 . 0;
B类地址的默认子网掩码是255 . 255 . 0 . 0;
C类地址的默认子网掩码是255.255.255.0。
子网,一般是255.255.255.0。
ip地址的前三段用于确定路由器,最后一段是主机位置。所以子网掩码理解为子网掩码编码。
1.3.2、Socket
一台pc对应网络上的一台主机,这台Pc上会有很多进程需要访问网络。所以需要在Pc的操作系统上有处理网络的东西,所以前人专门设置了一个“socket”来处理网络(源IP地址和目的IP地址以及源端口号和目的端口号的组合称为socket)。一台主机分成N个,总共会有65,536个网口(端口),这是short的最大范围。在这些端口中,需要注意的是,0-5,000个端口一般不被使用,而是被操作系统的进程使用。一般用后面的端口,比较安全。当然,有些端口,比如8080端口,也是用的比较多的。一个进程只能占用一个端口,但是不能有很多进程占用同一个端口。一个进程可以占用多个端口,也可以很严格。一个端口在同一时间只能被一个进程使用。网络上的两个程序通过双向通信连接交换数据,通信连接的一端称为套接字。
建立网络通信连接至少需要一对端口号(套接字)。Socket的本质是编程接口(API),它封装了TCP/IP,TCP/IP也为程序员提供了一个做网络开发的接口。这是套接字编程接口。也称为“套接字”,用于描述IP地址和端口。它是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
1.3.3、tcp通信模型
C/s模式,客户端(c)/服务器(S)模式,一个服务器处理多个客户端,一对多关系。下面的步骤没有特别指出,但是服务器和客户端都需要:
1.准备,根据自己的语言导入所有库函数;
2.确定版本信息。要确定套接字版本,有两个版本的ip: v4和v6。
3.创建一个套接字并使用套接字函数
4.初始化协议地址簇;
5.绑定,使用bind函数将协议地址簇和socket绑定在一起,客户端不绑定;
6.服务端有,需要监听监听监听功能,客户端不需要这一步;
7.服务器需要接受连接,客户端需要连接到服务器;
8.连接完成后,开始通信,收发数据;
9.关闭插座;在通信完成之后;
二、Qt中的tcp(这里只展示代码)
将此网络添加到。之前项目的pro文件。
1、tcpsevertcpsever.h
#ifndef WIDGET_H
#定义WIDGET_H
#包含QWidget
#包含QNetworkInterface//网络信息
#包含QHostAddress//id地址
#包含QTcpServer //tcp协议
#include QTcpSocket //socket套接字
#包含QDebug
#包含QMessageBox
命名空间Ui {
类小部件;
}
类小部件:公共QWidget
{
q _对象
公共:
显式Widget(q Widget * parent=0);
~ Widget();
专用插槽:
void on _ button _ listen _ clicked();
void on _ button _ send _ clicked();
void newconnectslot();//连接
void ready read _ Slot();//读取信息
void disconnected _ Slot();//断开连接
专用插槽:
QString list _ all _ IP v4();
私人:
ui:Widget * ui;
//2.设置服务器和接收客户端的对象。
QTcpServer * tcpServer
QTcpSocket * tcpSocket
};
#endif //WIDGET_H
tcpsever.cpp
#include widget.h
#include ui_widget.h
Widget:Widget(QWidget *parent):
QWidget(父级),
ui(新Ui:小部件)
{
ui-setupUi(这个);
//3.创建服务器对象
tcpSocket=NULL
TCP server=new QTcpServer(this);
//5.客户端连接到服务器发送信号。
连接(tcpServer,
信号(newConnection()),
这个,
SLOT(newconnectslot());
QMessageBox:information(this,本地网络端口显示,this-list _ all _ IP v4());
}
Widget:~Widget()
{
删除ui;
}
void小部件:on _ pushButton _ listen _ clicked()
{
//4,开始听。
QString sever _ Address=ui-line edit _ Address-text();
quint 16 port=ui-line edit _ port-text()。toInt();
QHostAddress主机=QHostAddress(服务器地址);
如果(!tcpServer-isListening()){
//监听绑定的ip地址
如果(!tcpServer-listen(主机,端口))
{
qDebug()TCP server-errorString();
返回;
}否则{
qDebug()监听成功;
ui-pushButton_listen-setText(停止监听);
}
}否则{
TCP server-close();
ui-pushButton_listen-setText(开始监听);
}
}
QString小部件* list _ all _ IP v4(){
QString字符串;
QListQHostAddress list=QNetworkInterface:all addresses();//获取本机的所有网卡的互联网协议(互联网协议的缩写)地址
foreach (QHostAddress地址,列表)
{
if(address.isNull())
继续;
QAbstractSocket:NetworkLayerProtocol Porto col=address。协议();
//只提取IPv4地址
如果(portocol!=QAbstractSocket:IPv4Protocol)
继续;
str=str 地址。tostring() n t t ;
}
返回字符串;
};
空的小部件* newconnectslot(){
//6、接受客户端
TCP socket=TCP server-next pending connection();
QString client_Info=客户端: tcpSocket-peerAddress().toString()
端口号: QString:number(TCP socket-peer port());
ui-文本浏览器_客户端信息-setText(client _ Info);
//发送信号和读取关联
连接(tcpSocket,
SIGNAL(readyRead()),
这个,
SLOT(ready _ SLOT());
//断开信号关联客户端
连接(tcpSocket,
信号(断开()),
这个,
SLOT(disconnected _ SLOT());
};
void Widget:on _ button _ send _ clicked()
{
if(tcpSocket!=nullptr)
{
if(tcpSocket-isWritable())
{
QString send=ui-plain textedit _ sendInfo-toPlainText();
QByteArray sendarr=send。to local 8 bit();//本地字符集与统一码的转换
TCP套接字写(sendarr);
}
}
}
空的小部件* ready read _ Slot(){
if(tcpSocket!=nullptr)
{
if(tcpSocket-isReadable())
{
QByteArray recvAll=TCP socket-read all();//将数据全部读取
QString str=str。从本地8位(记录值。data());
ui-文本浏览器_ recv-append(str);
}
}
};
空的小部件:disconnected_Slot(){
QMessageBox:信息(this,客户端关闭信号,有客户离开);
};
2、tcpclient传输控制协议(Transmission Control Protocol)客户端,h
#ifndef WIDGET_H
#定义WIDGET_H
#包含QWidget
#include QNetworkInterface//网络信息
#包含QHostAddress//id地址
#包含QTcpServer //tcp协议
#包含QTcpSocket//套接字套接字
#包含QDebug
#包含QMessageBox
命名空间Ui {
类小部件;
}
类小部件:公共QWidget
{
q _对象
公共:
显式Widget(q Widget * parent=0);
~ Widget();
专用插槽:
void on _ button _ listen _ clicked();
void on _ button _ send _ clicked();
void ready read _ Slot()。//读取信息
void disconnected _ Slot();//断开
私人:
ui:Widget * ui;
QTcpSocket *客户端;
弯曲件套接字_状态;
};
#endif //WIDGET_H
tcpclient.cpp
#include widget.h
#include ui_widget.h
Widget:Widget(QWidget *parent):
QWidget(父级),
用户界面(新Ui:小部件)
{
ui-setupUi(这个);
client=new QTcpSocket(this);
套接字状态=假
连接(客户端,
信号(断开()),
这个,
SLOT(disconnected _ SLOT());
连接(客户端,
SIGNAL(readyRead()),
这个,
SLOT(ready _ SLOT());
}
Widget:~Widget()
{
删除ui;
}
空的小部件on _ pushButton _ listen _ clicked()
{
QString IP address=ui-line edit _ address-text();
qint 16 port=ui-line edit _ port-text().toInt();
如果(!套接字状态)
{
client-connectToHost(ipAddress,port);
if(客户端-等待连接(3000)){//等待3s,连不上会返回假
ui-pushButton_listen-setText(断开连接);
套接字状态=真
}否则{
qDebug()client-errorString();
返回;
}
}否则{
客户端关闭();
QMessageBox:信息(这个,’消息提示,已经离开!,QMessageBox:Yes);
ui-pushButton_listen-setText(连接);
套接字状态=假
}
}
空的小部件* ready read _ Slot(){
QByteArray data=client-read all();
QString str=str。从本地8位(数据。data());
ui-文本浏览器_ recv-append(str);
};
空的小部件:disconnected_Slot(){
qDebug()离开;
}
void Widget:on _ button _ send _ clicked()
{
QString datastr=ui-纯文本edit _ sendInfo-toPlainText();
QByteArray da=datastr。to local 8 bit();
if(client-iso pen()client-is valid()){
客户端写入(da);
}
}
三、QT中的Udp
初始操作同传输控制协议(传输控制协议)操作
udp_test.h
#ifndef WIDGET_H
#定义WIDGET_H
#包含QWidget
//1、包含相关的头文件
#包含QHostAddress
#包含QUdpSocket
#包含QDebug
命名空间Ui {
类小部件;
}
类小部件:公共QWidget
{
q _对象
公共:
显式Widget(q Widget * parent=0);
~ Widget();
专用插槽:
void on _ button send _ clicked();
void readyReadSlot();
void on _ button close _ clicked();
私人:
ui:Widget * ui;
//2、定义用户数据报协议对象
QUdpSocket * udpSocket
};
#endif //WIDGET_H
udp_test.cpp
#include widget.h
#include ui_widget.h
Widget:Widget(QWidget *parent):
QWidget(父级),
用户界面(新Ui:小部件)
{
ui-setupUi(这个);
//3、创建对象
UDP socket=new qudp socket(这个);
//4、关联读取的信号与槽
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(ready read SLOT());
}
Widget:~Widget()
{
删除ui;
}
空的小部件* on _ buttonsend _ clicked()
{
UDP套接字-写数据报(ui-纯文本edit _ sendInfo-toPlainText()。到本地8位(),//内容
QHostAddress(ui-lineEditIp-text()),//发送互联网协议(互联网协议的缩写)
ui-lineEditPort-text().toInt());//发送的地址
}
空的小部件on _ pushButtonCLose _ clicked()
{
UDP套接字绑定(ui-lineEditPort _ 2-text().toInt());
}
空的小部件* readyReadSlot(){
quint 64 size=UDP套接字-可用字节数();//读取发过来的消息大小
QByteArray ba
ba.resize(大小);
QHostAddress地址;
第16集端口;
udpSocket-readDatagram(ba.data(),size,address,port);
QString str=QString:从本地8位(ba。data());
ui-textEdit _ recvInfo-append(str);
}
到此这篇关于夸脱中网络编程的实现的文章就介绍到这了,更多相关夸脱网络编程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!