QTcpSocket的连续发送数据和连续接收数据
2012-12-17 10:57
323 查看
关于这个问题折腾了我好久,以前做些小练习的时候,用QTcpSocket的write()一数据,然后接收方只要emit一个readyread()信号然后就用QTcpSocket的read()去读。本以为只要发送方write一次,接收方就会响应readyRead信号。其实根本就不是这样的,readyRead不会知道发送方调用了几个write,它只负责在有数据到达时触发,等你真正接收时,或许已经能够收到所有的数据了。这要看你发送的信息量了,如果很少的话,比如发送几个字节的数据当然没有问题,一次readyRead就能读到所有数据但切记,这不是必然的!另外readRead到底能读多少数据是不确定的,这要看你的网速情况,还有你的电脑的性能了。
举个例子,我在编程时用发送方while()连续向网络上传输数据,这个文件的数据量很大,就要使用waitForBytesWritten做一下等待,这就是每次等上一个write()完毕后才继续下一个write()这样数据就不会漏或者乱。还有一个问题是要传输数据时一定要先告诉接收方发的数据量是多大,也就是在发真正的数据时的头部用2个字节(quint16)或四个字节(quint32)去存放传送数据的大小。接收方就是根据这个传输数据的大小和每次bytesAvailable()的大小做对比若小就不断的触发emit的信号,在去接收,知道最终接收的总数据跟发送方的数据大小是一致的就说明接收完毕。这就解决了大数据量连续发送与接收的问题。
举个例子,我在编程时用发送方while()连续向网络上传输数据,这个文件的数据量很大,就要使用waitForBytesWritten做一下等待,这就是每次等上一个write()完毕后才继续下一个write()这样数据就不会漏或者乱。还有一个问题是要传输数据时一定要先告诉接收方发的数据量是多大,也就是在发真正的数据时的头部用2个字节(quint16)或四个字节(quint32)去存放传送数据的大小。接收方就是根据这个传输数据的大小和每次bytesAvailable()的大小做对比若小就不断的触发emit的信号,在去接收,知道最终接收的总数据跟发送方的数据大小是一致的就说明接收完毕。这就解决了大数据量连续发送与接收的问题。
相关文章推荐
- QTcpSocket的连续发送数据和连续接收数据
- QTcpSocket的连续发送数据和连续接收数据
- QTcpSocket 发送和接收数据的几种方法
- QTcpSocket 发送和接收数据的几种方法
- QTcpSocket 发送和接收数据的几种方法
- 使用QTcpSocket接收数据
- QTcpSocket发送数据和自定义数据
- QT QTcpSocket发送数据问题
- QT tcpsocket 发送/接收数据
- QTcpSocket发送数据和自定义数据
- QTcpSocket 发送数据心得
- Socket —>AsyncSocket(ios socket第三方框架 AsyncSocket使用简介,连接,心跳,断线,数据发送与接收)
- Android Socket 发送与接收数据问题: 发送后的数据接收到总是粘包
- Android socket通过UDP的方式发送,接收数据
- 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
- Java中通过TCP协议发送和接收数据-Socket编程
- C#网络Socket的数据发送与接收处理(利用异步)的模板(模式)
- qtcpsocket调用write和read函数写数据乱码问题解决方法
- C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
- 使用Socket类接收和发送数据