QTCP/QUDP通讯建立思路分析

一、 对于QT中的UDP通讯建立,必须使用QT自己的UDP类,即QUDP。那么如何建立QUDP通讯,来作为上、下位机通讯呢??

思路分析:

第一步: 实例化QUdpSocket套接字(new QUdpSocket)

第二部: 绑定本程序IP与端口地址,bool bind ( const QHostAddress & address, quint16 port )

完成以上两步后,需要接收数据,或者发送数据。

方法1:

接收数据需要绑定信号:void readyRead (), 在自定义的槽函数中调用:qint64 pendingDatagramSize () const获取数据长度; 然后直接读取数据:
qint64 readDatagram ( char * data, qint64 maxSize, QHostAddress * address = 0, quint16 * port = 0 )

方法2:

如果有接收或者发送数据量比较大,则收发数据会占用大量CPU,从而导致界面很卡,为此,QUdpSocket可以实例化在线程之中,这样整个接收函数在

线程之中运行,而不至于影响界面刷新。

有时候主程序很忙,接收到的数据没法及时解析并进入主程序处理流程,这时候就需要增加发送与接收链表,将接收到的完整数据直接放入链表中,设置

定时器或者增加发送与接收链表线程,定时将数据转发出去。

链表线程循环检查发送与接收链表中的数据,如果有则直接发送,如果没有则进入短暂休眠,休眠完成后再次检查。

第三步:在线程RUN函数中循环,通过调用bool  hasPendingDatagrams () const, 如果有数据则调用方法1中的两个函数读取数据,完成后放入链表中。

如果没有数据,则进入短暂休眠。
 

二、对于QTCP来说,需要客户端处理方法思路同UDP

第一步:创建QTCPSocket套接字(new QTcpSocket)

第二步:主动连接主机,连接主机时要确保主机已经启动并且已经进入监听状态,不然客户端无法连接 :  void connectToHost ( const QString & hostName, quint16 port, OpenMode openMode = ReadWrite )

完成以上两步之后则需要等待连接成功信号,绑定void connected ()信号。也可以调用bool waitForConnected ( int msecs = 30000 ),阻塞等待连接;

客户端程序的收发数据可以放入同一个线程,并且使用同一个QTcpSocket,;在调用阻塞函数等待连接成功后,可以向服务端发送数据。客户端的发送数据与接收数据同样建立

缓存链表,接收数据缓存链表使用线程控制,定时转发数据;发送链表数据则在线程中被QTCPSocket定时获取,不需要额外的线程转发。

 

服务端需要创建:QTCPServer

第一步: 创建QTcpServer套接字(new QTcpServer);

第二步: 监听客户端连接:bool listen ( const QHostAddress & address = QHostAddress::Any, quint16 port = 0 )

第三步: 绑定新客户端连接建立信号void newConnection ()

第四部: 如果信号触发,则调用virtual QTcpSocket * nextPendingConnection () 获取连接的客户端套接字,并做管理,进行交互等。

 

 

 

 

 

 

你可能感兴趣的:(QTCP,QUDP,socket,网络)