qtsocket网络通信

kekeoutlook kekeoutlook     2023-02-28     312

关键词:

 

https://blog.csdn.net/u013007900/article/details/50411796

 

里主要讲解如何实现TCP和UDP的简单通信。

socket简介
在LINUX下进行网络编程,我们可以使用LINUX提供的统一的套接字接口。但是这种方法牵涉到太多的结构体,比如IP地址,端口转换等,不熟练的人往往容易犯这样那样的错误。QT中提供的SOCKET完全使用了类的封装机制,使用户不需要接触底层的各种结构体操作。而且它采用QT本身的signal-slot机制,使编写的程序更容易理解。

这是文档。个人觉得,QT的文档除了缺少一些例子,其他还是不错的。

QT5中相比于QT4应该更新了一些socket的应用,QT4相比于QT3也更新了不少,而且还改了很多的类名,大家在网上找资料的时候一定要注意。
---------------------

UDP通信

UDP没有特定的server端和client端,简单来说就是向特定的ip发送报文,因此我把它分为发送端和接收端。

注意:在.pro文件中要添加QT += network,否则无法使用Qt的网络功能。

 

 

#include <QtNetwork>
QUdpSocket *sender;
sender = new QUdpSocket(this);

QByteArray datagram = “hello world!”;

//UDP广播
sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,6665);

//向特定IP发送
QHostAddress serverAddress = QHostAddress("10.21.11.66");
sender->writeDatagram(datagram.data(), datagram.size(),serverAddress, 6665);

/* writeDatagram函数原型,发送成功返回字节数,否则-1
qint64 writeDatagram(const char *data,qint64 size,const QHostAddress &address,quint16 port)
qint64 writeDatagram(const QByteArray &datagram,const QHostAddress &host,quint16 port)
*/

 

  

UDP接收端

#include <QtNetwork>
QUdpSocket *receiver;

//信号槽
private slots:  
    void readPendingDatagrams(); 

receiver = new QUdpSocket(this);
receiver->bind(QHostAddress::LocalHost, 6665);
connect(receiver, SIGNAL(readyRead()),this, SLOT(readPendingDatagrams()));

void readPendingDatagrams()
 
     while (receiver->hasPendingDatagrams()) 
         QByteArray datagram;
         datagram.resize(receiver->pendingDatagramSize());
         receiver->readDatagram(datagram.data(), datagram.size());
         //数据接收在datagram里
/* readDatagram 函数原型
qint64 readDatagram(char *data,qint64 maxSize,QHostAddress *address=0,quint16 *port=0)
*/
     
 

  

TCP通信

TCP的话要复杂点,必须先建立连接才能传输数据,分为server端和client端。

TCP client端

#include <QtNetwork>
QTcpSocket *client;
char *data="hello qt!";
client = new QTcpSocket(this);
client->connectToHost(QHostAddress("10.21.11.66"), 6665);
client->write(data);

  TCP server端

#include <QtNetwork>
QTcpServer *server;
QTcpSocket *clientConnection;
server = new QTcpServer();
server->listen(QHostAddress::Any, 6665);
connect(server, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
void acceptConnection()

    clientConnection = server->nextPendingConnection();
    connect(clientConnection, SIGNAL(readyRead()), this, SLOT(readClient()));

void readClient()

    QString str = clientConnection->readAll();
    //或者
    char buf[1024];
    clientConnection->read(buf,1024);


  

至于传中文乱码的问题,其实可以在前面的文章中解决。

也可以看看这个

----------------------------------------------------------------------------------------

将有关编码的代码全部删除后,通过了 并且能够运行。但是。。

挺萌的,乱码。发送和接受都乱码。

研究找到解决方法如下。

参考两段代码,发送和接受的:

发送:、

void TcpS::btn_send()

     QByteArray datasend = ui->textEdit->toPlainText().toLocal8Bit();
     m_tcpsocket->write(datasend);

  

接收:

void TcpS::read_datagram()

    QByteArray dataread = m_tcpsocket->readAll();
    QString str = QString::fromLocal8Bit(dataread);
    ui->textBrowser->insertPlainText(str+"
");

  

 

qtsocket编程问题qsocketdevice在哪个头文件里?顺便,写这种程序要包含哪些头文件?

这个最新的版本没有这个东西,我找了,找不到,只有QSocketDevice这个类有,具体对应的头文件在<Q3Support/q3socketdevice.h>参考技术Amsconfig 查看详情

qtsocket编程问题,不能接收数据,懂的帮忙解答一下,谢谢了。

////这是发送的函数voidmainWig::sendRequest()QByteArrayblock;QDataStreamout(&block,QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_5_3);out<<quint16(0)<<tr("HELLO");out.device()->seek(0);out<<quint16(block.size()-sizeof(quint16));if(tcpSocket.write(b... 查看详情

QTcpSocket真的是全双工的吗?

...这意味着两个连接方可以同时发送/接收。一个QTcpSocket(qtsocket实现)支持异步,非阻塞模式,但只能属于一个线程,见qtdocs。事件驱动对象只能在单个线程中使用。具体来说,这适用于定时器机制和网络模块。假设我想要一个... 查看详情

网络编程——基础知识

本机进程间通信与网络通信本机进程间通信实现本机内部的进程间的通信,通信时需要使用专门IPC机制,比如信号、管道(无名、有名)、systemVIPC,(消息队列、共享内存、进程信号量)。这些参考前面文章网络通信网络通信... 查看详情

基于tcp协议的网络通信

...程序就可以通过虚拟链路进行通信。Java对基于TCP协议的网络通信提供了良好的封装,Java使用Socket对象来代表两端的通信接口,并通过Socket产生IO流来进行网络通信。 查看详情

软件结构和网络通信

...程,就是在一定的协议下,实现两台计算机的通信的程序网络通信网络通信协议:通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行和通信时,需要遵守一定的规则,这就好比在道路中形式的汽车一... 查看详情

day785.网络通信优化之通信协议:如何优化rpc网络通信-java性能调优实战(代码片段)

网络通信优化之通信协议:如何优化RPC网络通信Hi,我是阿昌,今天学习记录的是关于网络通信优化之通信协议:如何优化RPC网络通信。微服务框架,其中SpringCloud和Dubbo的使用最为广泛,行业内也一直存在... 查看详情

00104_网络通信协议

1、网络通信的概述  (1)通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则;  (2)在计算机网络中,这些连接和通信的规则被称为网络通信协议;  (3... 查看详情

第三部分:分布式系统网络通信

...分第二部分:分布式架构基础、Paxos算法、Raft算法、系统网络通信 第三部分:分布式系统网络通信一、网络通信基础计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一... 查看详情

第八课网络通信

unix_c_08.txt================第八课网络通信================一、基本概念------------1.ISO/OSI七层网络协议模型~~~~~~~~~~~~~~~~~~~~~~~~~~+------------+--------------+---|应用层|Application|^+------------+--------------+||表示层|Pr 查看详情

网络通信协议和通信

1.通信规则(建立规则)标志发出方和接收方通用语言和语法传递的速度和时间证实或确认要求2.多协议互动时常见的计算机协议·消息编码·消息格式和封装·消息大小·消息时序·消息传输选项 查看详情

hcna-网络通信基础

...p;   2、OSI模型和TCP/IP模型    在网络通信中,所谓协议,就是指诸如计算机、交换机、路由器等网络设备为了实现通信而必须遵从的 查看详情

docker-----网络自定义网络容器通信跨主机容器通信(代码片段)

目录一.Docker网络1.桥接网络2.host网络模式3.none模式二.自定义网络1.创建自定义网络2.自定义网络3.手动指定ip4.双网卡实现不同网段间的容器通信三.Docker容器通信1.使用容器名称通信2.–link可以用来链接2个容器3.容器如何访问外网4... 查看详情

12.网络通信

‘‘‘网络通信用于获取一个算法在本地运行所需的数据,还可以共享信息实现分布式处理,另外可以用来管理云服务。python的标准库提供了一些模块来创建网络服务以及访问现有服务ipaddress模块提供了一些类来验证、比较和处... 查看详情

java网络编程入门(软件结构网络通信协议网络编程三要素)

@[toc] 查看详情

网络通信协议(代码片段)

网络通信协议可分为三类通信协议伪协议第三方协议通信协议通信协议[1]由互联网工程任务组IETF[2]制定.我们可以在https://tools.ietf.org/或https://www.ietf.org/的RFCIndex页面查看它制定的标准:比如UniformResourceIdentifiers(URI)和UniformResourceLoca... 查看详情

网络通信基本条件及过程

通信条件:通信过程: 查看详情

网络通信基本条件及过程

通信条件:通信过程: 查看详情