[日志]homeCloud项目NET模块重构

描述:

在做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信号,前者处理链接上服务器后的操作,后者作为循环信号来发送文件


按这种方式实现,客户端能正常将文件发送到服务端,并且无阻塞现象



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值