首页 > 作文

Qt中网络编程的实现

更新时间:2023-04-04 21:49:03 阅读: 评论:0

目录
一、tcp/ip协议簇与udp 1、tcp/ip协议族2、udp3、常用的通讯协议小结二、qt中的tcp(这里只展示代码)1、tcpver2、tcpclient三、qt中的udp

由于我没有系统的分享一些简单的计算机网络有关的,下面只是简单讲讲tcp/ip协议簇和udp

一、tcp/ip协议簇与udp

1、tcp/ip协议族

tcp/ip实际上是一个协同工作的通信家族,为网络通信提供通路。为方便讨论tcp/ip协议族,大体上分为三部分:

①、internet协议(ip)。

②、传输控制协议(tcp)和用户数据报协议(udp)。

③、处于tcp和udp之上的一组应用协议。它们包括:telnet,文件传送协议(ftp),域名服务协议(dns)和简单的邮件传送程序(smtp)等。

2、udp

udp协议(用户数据报协议),它与tcp协议完全相反。提供不可靠、无连接和基于数据报的服务。不可靠意味着udp协议无法保证数据从发送端正确的发送到接收端。如果数据在中途丢失,或者目的端通过数据校验发现数据错误而将其丢弃,则udp协议的应用程序通常要自己处理数据确认、超时重传等逻辑性。

3、常用的通讯协议小结

1.3.1、tcp/ip

tcp只需要知道它是一种通讯方式就可以了,还有一个udp,那这两者之间的关系是什么。tcp/ip协议是一个协议簇。里面包括很多协议的。udp只是其中的一个。之所以命名为tcp/ip协议,因为tcp,ip协议是两个很重要的协议,就用他两命名了,tcp是打电话,udp是发短信。

ip(网络之间互连的协议,外文是internet protocol的外语缩写,中文缩写为“网协”。缩写为ip),通过设置ip地址就可以去访问网络,用的最多的ip协议是ipv4(ip协议v版本4),还有一个版本为ipv6,ipv4不够用了,ipv4版本是32位的,一般分成4段,内存中就是一个无符号32位的整数,ipv6的话就是一个64位的整数,通过位数就知道ipv英文数字读法4和ipv6的区别,能保存多少个的地址。只不过用户并不需要去搞清楚。

现在常用的ip是127.0.0.1这个样子,点分格式(一个字符串)。点所隔开的区间就是一个字符。ip地址有abc三类地址。前三段是用来确定路由器,确定主机连上外围网上的哪一个路由,最后一段用来确定主机,确定主机是这个路由器上的第多少台,最多255台,0一般是用来做网关的。

ip对应的还有一个子网掩码

子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个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机的操作系统上面去有处理网络的东西,前人就定了一个“套接字”来专门处理网络(源ip地址和目的ip地址以及源端口号和目的端口号的组合称为套接字)。把一个主机拆分为n个网络端口(port)一共会有65536个,short的最大范围,在这些端口当中,要注意0-5000的端口一般不用,用来给操作系统的进程来使用的。一般会用靠后一点的端口,这样比较安全,当然还有一些端口,比如8080端口也会用的比较多,一个进程只能占用一个端口,不能多进程占用同一个端口的情况,一个进程可以占用多个端口的,或者严谨一点,同一时刻一个端口只能由一个进程使用。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(api),对tcp/ip的封装,tcp/ip也要提供可供程序员做网络开发所用的接口,这就是socket编程接口。通常也称作”套接字”,用于描述ip地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。

1.3.3、tcp通信模型

c/s模型,客户端(c)/服务器(s)模型,一个服务器来对应多个客户端的处理,一对多的关系。以下步骤没有特殊指明,服务器和客户端是都需要有的步骤:

1.准备工作,根据自己使用语言所有库函数导入;

2. 确定版本信息,要确定socket版本,ip是有v4和v6两个版本的;

3. 创建socket,使用socket函数

4. 初始化协议地址簇 ;

5. 绑定,使用bind函数,把协议地址簇和socket绑定在一起,客户端不要绑定;

6. 服务器端有,需要监听 listen函数,客户端不需要这一步;

7. 服务器端需要接受连接,客户端需要连接服务器;

8. 连接完成之后,开始通讯,收发数据;

9. 通讯完成后关闭socket;

二、qt中的tcp(这里只展示代码)

开始前在项目的.pro文件中加入这个network

1、tcpver

tcpver.h

#ifndef widget_h#define widget_h #include <qwidget>#include <qnetworkinterface>//网络信息#include <qhostaddress>//id地址#include <qtcprver> //tcp协议#include <qtcpsocket> //曲中意socket套接字#include <qdebug>#include <qmessagebox>namespace ui {class widget;} class widget : public qwidget{    q_object public:    explicit widget(qwidget *parent = 0);    ~widget(); private slots:    void on_pushbutton_listen_clicked();     void on_pushbutton_nd_clicked();    void newconnectslot();//连接    void readyread_slot();//读取信息    void disconnected_slot();//断开private slots:    qstring list_all_ipv4(); private:    ui::widget *ui;    //2、设置服务端和接收客户端的对象    qtcprver *tcprver;    qtcpsocket *tcpsocket;}; #endif // widget_h

tcpver.cpp

#include "widget.h"#include "ui_widget.h" widget::widget(qwidget *parent) :    qwidget(parent),    ui(new ui::widget){    ui->tupui(this);    //3、创建服务器对象    tcpsocket=null;    tcprver=new qtcprver(this);    //5、有客户端连接服务器发送信号    connect(tcprver,            signal(newconnection()),            this,            slot(newconnectslot()));    qmessagebox::information(this,"本机联网端口显示",this->list_all_ipv4());} widget::~widget(){    delete ui;} void widget::on_pushbutton_listen_clicked(){    //4、开始监听    qstring ver_address = ui->lineedit_address->text();    quint16 port          = ui->lineedit_port->text().toint();    qhostaddress host     = qhostaddress(ver_address);    if(!tcprver->islistening()){        //监听绑定的ip地址        if(!tcprver->listen(host,port))        {            qdebug()<<tcprver->errorstring();            return;        }el{            qdebug()<<"监听成功";            ui->pushbutton_listen->ttext("停止监听");        }    }el{        tcprver->clo();        ui->pushbutton_listen->ttext("开始监听");    }} qstring widget::list_all_ipv4(){            qstring str;            qlist<qhostaddress> list=qnetworkinterface::alladdress();     //获取本机的所有网卡的ip地址            foreach (qhostaddress address, list)            {                if(address.isnull())                    continue;                qabstractsocket::networklayerprotocol portocol=address.protocol();                //只提取ipv4地址                if(portocol!=qabstractsocket::ipv4protocol)                    continue;                 str = str +'\n\t'+address.tostring() + '\n\t\t';            }            return str;}; void widget::newconnectslot(){    //6、接受客户端    tcpsocket = tcprver->nextpendingconnection();    qstring client_info = "客户端:" + tcpsocket->peeraddress().tostring()                          +" "+                          "端口号:"    + qstring::number(tcpsocket->peerport());    ui->textbrowr_clientinfo->ttext(client_info);    //发送信号和读取关联    connect(tcpsocket,            signal(readyread()),            this,            slot(readyread_slot()));    //断开信号关联客户端    connect(tcpsocket,            signal(disconnected()),            this,            slot(disconnected_slot()));}; void widget::on_pushbutton_nd_clicked(){    if(tcpsocket != nullptr)    {        if(tcpsocket->iswritable())        {            qstring nd = ui->plaintextedit_ndinfo->toplaintext();             qbytearray ndarr = nd.tolocal8bit();//本地字符集与unicode的转换             tcpsocket->write(ndarr);        }    }} void widget::readyread_slot(){    if(tcpsocket != nullptr)    {        if(tcpsocket->isreadable())        {           qbytearray recvall = tcpsocket->readall();//将数据全部读取            qstring str = str.fromlocal8bit(recvall.data());            ui->textbrowr_recv->append(str);        }    } }; void widget::disconnected_slot(){    qmessagebox::information(this,"client clo signal","有客户离开");};

2、tcpclient

tcpclient,h

#ifndef widget_h#define widget_h #include <qwidget>#include <qnetworkinterface>//网络信息#include <qhostaddress>//id地址#include <qtcprver> //tcp协议#include <qtcpsocket> //socket套接字#include <qdebug>#include <qmessagebox&冰水混合物是纯净物吗gt;namespace ui {class widget;} class widget : public qwidget{    q_object public:    explicit widget(qwidget *parent = 0);    ~widget(); private slots:    void on_pushbutton_listen_clicked();    void on_pushbutton_nd_clicked();     void readyread_slot();//读取信息    void disconnected_slot();//断开 private:    ui::widget *ui;    qtcpsocket *cliwps表格ent;    bool socket_state;}; #endif // widget_h

tcpclient.cpp

#include "widget.h"#include "ui_widget.h" widget::widget(qwidget *parent) :    qwidget(parent),    ui(new ui::widget){    ui->tupui(this);    client = new qtcpsocket(this);    socket_state = fal;     connect(client,            signal(disconnected()),            this,            slot(disconnected_slot()));     connect(client,            signal(readyread()),            this,            slot(readyread_slot()));} widget::~widget(){    delete ui;}  void widget::on_pushbutton_listen_clicked(){    qstring ipaddress = ui->lineedit_address->text();    qint16 port = ui->lineedit_port->text().toint();     if(!socket_state)    {        client->connecttohost(ipaddress,port);        if(client->waitforconnected(3000)){//等待3s,连不上会返回假            ui->pushbutton_listen->ttext("断开连接");            socket_state = true;        }el{            qdebug()<<client->errorstring();            return;        }    }el{        client->clo();        qmessagebox::information(this,"消息提示","已经离开!",qmessagebox::yes);        ui->pushbutton_listen->ttext("连接");        socket_state = fal;    }} void widget::readyread_slot(){    qbytearray data=client->readall();    qstring str=str.fromlocal8bit(data.data());    ui->textbrowr_recv->append(str); }; void widget::disconnected_slot(){     qdebug()<<"离开";} void widge勇于担当t::on_pushbutton_nd_clicked(){    qstring datastr = ui->plaintextedit_ndinfo->toplaintext();    qbytearray da = datastr.tolocal8bit();     if(client->isopen() && client->isvalid()){        client->write(da);    }}

三、qt中的udp

初始操作同tcp操作

udp_test.h

#ifndef widget_h#define widget_h #include <qwidget> //1、包含相关的头文件#include <qhostaddress>#include <qudpsocket>#include <qdebug> namespace ui {class widget;} class widget : public qwidget{    q_object public:    explicit widget(qwidget *parent = 0);    ~widget(); private slots:    void on_pushbuttonnd_clicked();    void readyreadslot();    void on_pushbuttonclo_clicked(); private:    ui::widget *ui;    //2、定义udp对象    qudpsocket *udpsocket;}; #endif // widget_h

udp_test.cpp

#include "widget.h"#include "ui_widget.h" widget::widget(qwidget *parent) :    qwidget(parent),    ui(new ui::widget){    ui->tupui(this);    //3、创建对象    udpsocket=new qudpsocket(this);     //4、关联读取的信号与槽    connect(udpsocket,signal(readyread()),this,slot(readyreadslot())); } widget::~widget(){    delete ui;} void widget::on_pushbuttonnd_clicked(){    udpsocket->writedatagram(ui->plaintextedit_ndinfo->toplaintext().tolocal8bit(),//内容                             qhostaddress(ui->lineeditip->text()),//发送ip                             ui->lineeditport->text().toint());//发送的地址} void widget::on_pushbuttonclo_clicked(){    udpsocket->bind(ui->lineeditport_2->text().toint());} void widget::readyreadslot(){  quint64 size = udpsocket->bytesavailable();//读取发过来的消息大小  qbytearray ba;  ba.resize(size);  qhostaddress address;  quint16 port;   udpsocket->readdatagram(ba.data(),size,&address,&port);  qstring str = qstring::fromlocal8bit(ba.data());   ui->textedit_recvinfo->append(str);}

到此这篇关于qt中网络编程的实现的文章就介绍到这了,更多相关qt网络编程内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 21:49:01,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/6ef7f80e6203607fa473de190545a4f5.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Qt中网络编程的实现.doc

本文 PDF 下载地址:Qt中网络编程的实现.pdf

标签:协议   地址   端口   客户端
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图