客户端app多个线程对一个socket发送数据

客户端一般是一个发送线程维护着一个socket,该发送线程负责发送数据。

建立多个发送线程竞争一个socket进行发送数据没什么意义,并不会提高发送速度,因为socket只有一个,只要socket在发送一个发送线程的数据时,该socket就被占用了,是不会响应其他发送线程的发送数据请求的。除非客户端维护着多个socket。

服务端使用多线程向多个客户端同时发送数据可以提升发送速度是因为服务端维护着多个socket,每个socket对应一个客户端session连接,多个线程可以同时执行多个socket的send方法进行发送数据,从而提升发送效率。

参考:
客户端:多线程使用单个SOCKET发数
请教:多线程使用同一个socket进行数据收发会出现什么问题?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中,可以通过QTcpServer类来实现TCP服务器的编写,而多线程则可以通过QThread类来实现。下面是一个简单的示例程序,可以实现多线程多个客户端的通信: ```cpp #include <QtNetwork> #include <QtWidgets> #include <QtCore> class ClientThread : public QThread { Q_OBJECT public: explicit ClientThread(qintptr socketDescriptor, QObject *parent = nullptr) : QThread(parent), m_socketDescriptor(socketDescriptor) { } signals: void error(QTcpSocket::SocketError socketError); protected: void run() override { QTcpSocket socket; if (!socket.setSocketDescriptor(m_socketDescriptor)) { emit error(socket.error()); return; } connect(&socket, &QTcpSocket::readyRead, this, &ClientThread::readyRead); connect(&socket, &QTcpSocket::disconnected, this, &ClientThread::disconnected); exec(); } private slots: void readyRead() { QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender()); if (!socket) return; QByteArray data = socket->readAll(); // 处理接收到的数据 socket->flush(); } void disconnected() { QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender()); if (!socket) return; socket->deleteLater(); quit(); } private: qintptr m_socketDescriptor; }; class TcpServer : public QTcpServer { Q_OBJECT public: TcpServer(QObject *parent = nullptr) : QTcpServer(parent) { } protected: void incomingConnection(qintptr socketDescriptor) override { ClientThread *thread = new ClientThread(socketDescriptor, this); connect(thread, &ClientThread::finished, thread, &ClientThread::deleteLater); thread->start(); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); TcpServer server; if (!server.listen(QHostAddress::Any, 1234)) { qCritical() << "Failed to start server:" << server.errorString(); return 1; } qDebug() << "Server started:" << server.serverAddress().toString() << server.serverPort(); return app.exec(); } #include "main.moc" ``` 在这个示例程序中,TcpServer类继承自QTcpServer类,其中的incomingConnection()函数会在新的客户端连接时被调用。在该函数中,我们创建一个新的ClientThread线程,并将客户端socket描述符传递给它。在ClientThread线程中,我们可以通过QTcpSocket类来与客户端进行通信。当客户端连接断开时,我们需要清理socket并退出线程。 需要注意的是,由于Qt的对象树模型,我们需要在ClientThread线程使用deleteLater()函数来删除socket对象。这可以确保socket对象不会在其所属的线程销毁之前被销毁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值