描述:
在做NET模块的多机通信时遇到问题
要求程序本身既能当服务端又能当客户端,目前实现方法是使用Qt的QTcpServer,QTcpSocket等网络类库来实现
要求程序能同时连接多个服务端,同时也能连接多个客户端,目前实现为使用QT的线程类,在需要一个新的连接时,新开一个线程来做操作
遇到问题:
在处理多个线程时,目前知道的Qt中的IO机制为非阻塞的,打开则会一直读取,原计划利用Qt的信号,在产生连接成功或有数据可读时,才调用槽函数去读取,但同时存在很多个QTcpSocket连接时,没找到QTcpSocket管理的方法,无法定位是要读哪一个或者写哪一个,目前只能实现单机器通信。原因为想在槽函数中用套接字做参数,但Qt默认的几个信号都无法传递参数,无法将套接字传递给读写线程,造成读写线程无法定位读写端口。
总结:
因为对信号和槽机制了解的不够,Qt网络和多线程模块也不够,所以决定以liunx环境的Socket和Pthread重新做网络模块的收发工作。同时考虑想办法将参数传递到槽中,使得可以区分是那个端口的读写,以备使用。
追加:
在准备完全重构的时候,想到了可以的解决办法。
在服务端处理的时候,链接newConnection信号到处理函数acceptNew()
在函数中获取链接到的socket,再直接新建一个Qthread线程,将socket作为参数传递
QTcpSocket *clienSocket = tcpServer->nextPendingConnection();
在线程函数中链接readyRead信号,即可以实现在数据来的时候发射信号调用槽去读取了。
作为客户端时的处理方式为,需要新建链接时,新建一个QtcpSocket,链接到服务器后直接新建一个线程做之后的处理
sendSocket->connectToHost(serverIP, TRANS_PORT);
在新建的线程中链接connected信号和bytesWritten信号,前者处理链接上服务器后的操作,后者作为循环信号来发送文件
按这种方式实现,客户端能正常将文件发送到服务端,并且无阻塞现象