QUdpSocket和QTcpSocket的使用

一、QUdpSocket

1、UDP是一种基于无连接的、不可靠的数据报传输协议。

2、套接字可以当作一种输入输出设备,QUdpSocket可以调用writeDatagram()和readDatagram()对套接字进行读写。每当一次数据报写入完成后会释放bytesWritten()信号。

3、QUdpSocket在读之前要先调用bind()函数进行绑定,如果仅仅只是写的话则无需绑定。

4、当有数据报可读时,QUdpSocket会发出readRead()信号,可以通过定义关联该信号的槽函数,对数据进行读取。此时hasPendingDatagrams()也会返回true,pendingDatagramSize()可以用于获取数据报长度,然后调用读函数进行数据的读取。

void Server::initSocket()
{
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(QHostAddress::LocalHost, 7755);

    connect(udpSocket, SIGNAL(readyRead()),
            this, SLOT(readPendingDatagrams()));
}

void Server::readPendingDatagrams()
{
    while (udpSocket->hasPendingDatagrams()) {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
        QHostAddress sender;
        quint16 senderPort;

        udpSocket->readDatagram(datagram.data(), datagram.size(),
                                &sender, &senderPort);

        processTheDatagram(datagram);
    }
}

二、QTcpSocket

1、TCP协议是面向连接的、可靠的传输协议

2、QTcpSocket在使用之前,要先调用connectToHost()和目的主机建立连接,数据传输结束后要调用disconnectFromHost()断开连接。连接建立之后会发送connected()信号,连接断开之后会发送disconnected()信号。

3、当有数据可读时会发出readyRead()信号,可以通过byteAvailable()函数获取可读取的字节数。

4、可以调用write()和read()函数对套接字进行读写。

5、服务器编程时,一个服务器可能会连接到好几个客户端,此时可以调用setSocketDescriptor()协议设置套接字描述符。

6、abort()函数,和disconnectFromHost()函数功能类似,abort()会立即关闭套接字,并丢弃可读取的字节。

时间: 2024-11-13 04:02:10

QUdpSocket和QTcpSocket的使用的相关文章

[osg][osgEarth]基于qt代码实现:TCP|UDP与飞行模拟软件JSBSim的通信,现实模型飞行!

废话没有,上关键代码 头文件 #include <QUdpSocket> #include <qtcpsocket.h> #ifndef vrUDP #define vrUDP #define PLANE_DATA_NUM 30 struct PlanePoseStruct{ double lon; double lat; double height; double heading; double pitch; double rotate; }; class JSBSimSocke

5.关于QT中的网络编程,QTcpSocket,QUdpSocket

?? 1 新建一个项目:TCPServer.pro A  改动TCPServer.pro,注意:假设是想使用网络库.须要加上network SOURCES += \ TcpServer.cpp \ TcpClient.cpp HEADERS += \ TcpServer.h \ TcpClient.h QT += gui widgets network CONFIG += C++11 B 新建例如以下文件,由于要用到网络库,所以加上network C 编写IP选择下拉选,头文件ChooseInt

QUdpSocket 简单用法

UDP是无连接的不可靠的传输协议,可以用在可靠传输不是很重要的情况下使用. QUdpSocket是QAbstractSocket 的子类,它们都继承了QIODevice.所以可以用QUdpSocket进行发送接收数据.它和QTcpSocket最大的区别也就是,发送数据之前不需要建立连接. 以下简单例子,演示了用QUdpSocket如何实现客户端和服务端的通信.服务端代码: [cpp] view plain copy 1. class UDPServer:public QObject 2. { 3

QTcpSocket 及 TCP粘包分析

----我的生活,我的点点滴滴!! 这两天用Qt简单的实现一个tcp多线程client,在此记录下知识. 一.长连接与短连接 1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收. 2.短连接 Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接.此种方式常用于一点对多点通讯,比如多个Client 连接一个Server. 二.什么时候需要考虑粘包问题? 1.如果利用tcp每次发送数据,就与对方建立连接,然后双

QTcpSocket通信编程时阻塞与非阻塞的问题

目标,qt程序作为客户端,windows下winsock作为服务器端,实现两端通信. 开始时写了一个小函数测试: [cpp] view plaincopy QTcpSocket tmpSock;  tcpSock.connectToHost("59.64.159.87",7716);  tcpSock.write(buf,strlen(buf)+1);  msleep(3000);  tcpSock.disconnect(); 测试结果发现客户端只能连接到服务器端,而服务器端收不到客户

QTcpServer与QTcpSocket通讯

TCP        TCP是一个基于流的协议.对于应用程序,数据表现为一个长长的流,而不是一个大大的平面文件.基于TCP的高层协议通常是基于行的或者基于块的.          ●.基于行的协议把数据作为一行文本进行传输,每行都以一个换行符结尾.          ●.基于块的协议把数据作为二进制块进行传输,每块是由一个size大小字段和紧跟它的一个size字节的数据组成.        QTcpSocket通过器父类QAbstractSocket继承了QIODevice,因此他可以通过使用Q

Qt中QUdpSocket序列化问题

写了一个小的Qt网络程序,很简单,发送的网络消息除了字符串还有一个结构体.很简单的想到用memcpy()函数来将数据序列化为BYTE数组从而实现网络传输. 序列化是Java中一个概念,C中并没有,C++中后来引入了序列化和反序列化的概念.序列化是指将非系统类型的类的对象通过序列化操作转换成基本数据格式,从而达到便于网络传输或者文件读写的目的.反序列化是序列化的逆操作. 注:C/C++中BYTE与Char在内存中数据一样,形式相同,在Windef.h中有一行: typedef unsigned c

QT5在VS2013中找不到QtNetwork或QTcpSocket或QTcpSocket等头文件

一.首先是要有相关的库文件 方法一:手动添加库文件Qt5Networkd.lib 对项目进行右键,找到相关的属性,然后查看Linker中input部分的红色选项中是否含有Qt5Networkd.lib 如果没有,则必须添加Qt5Networkd.lib,直接通过键盘写入即可. 方法二:在建立项目时,添加Network选项即可   二.然后在程序中加入相应的头文件     在程序中,如果想一劳永逸,就写#include <QtNetwork/QtNetwork>,里面就包含了QTcpServer

QTcpSocket 发送数据的几种方法

1.QTcpSocket 继承于QAbstractSocket继承于QIODevice 2.QTcpSocket 提供的几种接收和发送数据方法 write ( const char *, qint64 ) : qint64 write ( const char * ) : qint64 write ( const QByteArray & ) : qint64 writeData ( const char *, qint64 ) : qint64 read ( char * data, qint