QTcpServer實現多客戶端連線

2021-09-29 10:50:09 字數 2586 閱讀 7354

qtcpserver使用請見:qtcpsocket-qt使用tcp通訊實現服務端和客戶端

qtcpserver類預設提供的只有無引數的newconnection的訊號,這樣雖然知道有人連線了,並且可以通過nextpendingconnection獲取連線的socket,但並不便於管理,尤其是在連線斷開以後無法判斷具體那個斷開了,因為qtcpsocket只提供了無參的disconnected訊號。。。

這樣就算在newconnection是儲存乙個list或者map,也無法在disconnected是知道具體是那一項斷開連線,給不同的qtcpsocket的訊號指向不同的槽。

實際上socket有自己的控制代碼,並通過下述函式在初步連線時就賦予了對應的socketdescriptor

virtual void incomingconnection(qintptr socketdescriptor)
當有client連線時,首先是此方法被呼叫,可自行在此方法內建立qtcpsocket並將socketdescriptor值賦予socket,並在socket斷開時告知此識別符號

原始碼請見github:qtothermoduleexamples

tcp_server.h

#ifndef tcp_server_h

#define tcp_server_h

#include namespace tcp_server_private

class qtcpsocket;

/** * @brief tcp多客戶端伺服器

*/class tcpserver : public qtcpserver ;

#endif // tcp_server_h

tcp_server.cpp

#include "tcp_server.h"

#include "tcp_server_private.h"

//建構函式

tcpserver::tcpserver(qobject *parent)

: qtcpserver(parent),

private_(new tcp_server_private::tcpserverprivate)

//析構函式

tcpserver::~tcpserver()

if(private_)

delete private_;

this->close();

}//重寫-有連線到來

void tcpserver::incomingconnection(qintptr handle)

auto client_socket = new tcp_server_private::tcpsocket(handle);

q_assert(client_socket->socketdescriptor() == handle);

//socket斷開連線的訊號與server槽連線

connect(client_socket,

&tcp_server_private::tcpsocket::clientdisconnected,

this,

&tcpserver::clientdisconnectedslot);

//主動斷開連線的操作

connect(this,

&tcpserver::initiativedisconnectclient,

client_socket,

&tcp_server_private::tcpsocket::disconnectsocket);

//map記錄

private_->clients.insert(handle, client_socket);

qdebug()qdebug()#ifndef tcp_server_private_h

#define tcp_server_private_h

#include namespace tcp_server_private ;

/** * @brief tcp多客戶端伺服器私有類

*/class tcpserverprivate ;

}//tcp_server_private

#endif // tcp_server_private_h

//cpp

#include "tcp_server_private.h"

namespace tcp_server_private );

}//主動斷開連線槽

void tcpsocket::disconnectsocket(qintptr handle)

}

上述範例將tcpsocket定義在tcp_server_private命名空間不對外可見,且tcpserver返回值也是qtcpsocket,若需要繼承qtcpsocket做更多自定義需要將tcpsocket移出

coologic 部落格網域名稱已更改,已從 www.techieliang.com 改為

www.coologic.cn,上述鏈結位址受到影響,若需檢視源文請手動修改,多有不便,敬請諒解。

域套接字 多客戶端實現

我們在linux 應用開發中,如果需要實現程序間通訊的多客戶端介面,就需要引入select 和epoll 相關機制了,本文介紹下epoll的功能的實現。多客戶端使用場景,比如我們需要開發乙個庫介面,提供給客戶呼叫,那麼使用域套接字實現程序間通訊,就必須在service端引入多路復用,否則庫功能就只能...

C語言網路程式設計 TCP實現多執行緒實現多客戶端

tcp通訊的程式設計模型如下 tcp通訊是必須要有乙個伺服器,通過accept函式與客戶端socket進行三次握手連線建立的通訊描述符與客戶端進行資料傳輸。此時可以將accept函式的連線設定為多執行緒形式,輪訓監聽,每獲取到乙個客戶端的連線,則建立乙個子執行緒專門用於和該客戶端進行通訊。實現 如下...

SUMO Traci多客戶端執行

參考sumo官網教程 1 對於路網,路網內交通燈以及路網內的車輛交通 流 等的設定,請參考其他高手,這裡簡單描述如何使用sumo traci多客戶端控制sumo gui執行。2 sumo traci的多客戶端執行的優勢如 3 我這裡以兩個客戶端為例,實現sumo traci多客戶端執行。直接上 會更...