天宫鹤

Qt之TCP通信笔记-发送端、接收端、客户端、服务端及write()、read()

一、Qt TCP通信接收端(listen()、ead()):
1.从发射 newConnection() 信号开始(当有新的 TCP 连接,会发射 newConnection() 信号);

2.当QTcpSocket缓存接收到新的数据时发射readyRead信号;

3.连接和传输过程中出错,均会发射errorOccurred()信号。

4.如果要处理到来的TCP连接,则可以使用QTcpServer类。调用listen()来设置服务器,然后关联newConnection()信号,每当有客户端连接时都会发射该信号。

5.槽中调用nextPendingConnection()来接受这个连接,然后使用该函数返回的QTcpSocket对象与客户端进行通信。
二、Qt TCP通信发送端(connectToHost()、write()):
1.从发射connected()信号开始(connectToHost()连接成功后会发射connected信号);

2.执行write()函数时会发射bytesWritten(qint64);

3.连接和传输过程中出错,均会发射errorOccurred()信号。

4.QTcpSocket代表了两个独立的数据流:一个用来读取,一个用来写入。

5.QTcpSocket是异步工作的,通过发射信号来报告状态改变和错误信息。

三、其他

1.Qt解决Socket传输后等中文乱码--->转成base64传输:
QByteArray(QString.toStdString().data()).toBase64()。

2.QByteArray 有toHex、有fromHex、有toBase64、有fromBase64。

3.[override virtual] qint64 QAbstractSocket::bytesAvailable() const

Returns the number of incoming bytes that are waiting to be read.
返回传入的等待读取的字节数。
bytesAvailable()函数返回缓冲区长度。该函数返回值会随着流操作>>发生变化(变小)。

4.QString字符串使用数据流将要发送的数据写到QByteArray对象中,占用字节数计算方法:

(1)如QString(tr("hello")),2*字符串长度 + 4,即2*5+4=14B,其中4字节表示字符串占用字节数(可表示4GB字符串)。

         用十六进制表示如下:"00 00 00 0a 00 68 00 65 00 6c 00 6c 00 6f",其中的00 00 00 0a表示字符串占10个字节。

         说明QString字符串使用16位的Unicode字符集表示,一个QString字符占2个字节。

(2)如"hello"(类型为char *),用十六进制表示如下:"00 00 00 06 68 65 6c 6c 6f 00",说明一个char *字符占1个字节,char *字符串自动在尾部添加终止符00。

四、可能会出现的问题

1、当触发readyRead信号,但是缓冲区的长度小于另一端发送的数据。这样就会触发多次readyReady信号。如果一次槽函数里面读取缓冲区的长度,数据就会接受不全,进行数据处理肯定会出问题。Qt的例子中提供了一种方法。在发送数据的头部加上数据的长度。只有当bytesAvailable大于数据的长度时,才读取数据。

2、系统API里面调用read是从系统缓冲区里面读取数据。如果系统缓冲区满的话。以前的就会被覆盖。但是Qt里面也存在缓冲区。如果一端发送数据。另一端并不从Qt缓冲区读取数据。那么Qt就会无限制的从系统缓冲区中读出数据放置自己内部缓冲区。最后肯定会出现堆栈满的情况,系统异常退出。

 



posted on 2022-08-31 20:31  GoGrid  阅读(1824)  评论(0编辑  收藏  举报

导航