一、 对于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 () 获取连接的客户端套接字,并做管理,进行交互等。