2011-11-05 63 views
1

在QTcpSockets和QThreads上,我一直在努力掙扎幾天。如何使用QThreads寫入多個QTcpSockets?

我有一個QTcpServer在一個端口上偵聽並使用nextPendingConnection()創建一個新的客戶端。所以現在客戶端有一個我可以用來讀寫的qtcpsocket。

假設我有100個客戶端連接到我的服務器。當他們中的一個想要向每個人廣播一條消息時,我的主線程(在我使用nextPendingConnection()創建客戶端的地方)將不得不迭代超過100個客戶端並在它們的套接字上調用write方法。例如,如果10個用戶同時廣播,我將不得不進行1000次迭代,所以在我看來,客戶端會有一些延遲(當用戶收到消息時)。

我想做所有的套接字寫在分離線程,以便我可以發送數據並列。我知道我不能從創建它的另一個線程中調用一個套接字,並且我不想爲每個客戶端使用一個線程,因爲我不知道是否有好多線程(此外,這些線程應該始終運行,除非客戶端斷開連接)。

我讀過線程財富服務器的例子,但它不回答我的問題,因爲它們在發送數據後銷燬套接字;我不想摧毀我的套接字,因爲我必須爲它收聽消息(所以我可以廣播它們)。

我想過的一件事是每個客戶端(在服務器和客戶端)有2個套接字;這樣我就可以保留一個讀取套接字,另一個我可以像線程財富服務器示例中一樣使用;在這種情況下,我還會使用一個線程池來限制任務的數量(否則它將與每個客戶端使用一個線程的情況相同)。

請你指點我正確的方向或給我一些提示,說明如何實現並行套接字寫入,而不需要每個客戶端都有一個線程......?

最好的問候,

塞巴斯蒂安

回答

0

有一個 'WriteToSocket' 功能,以特定的套接字寫入數據。此外,還有一個隊列,保存數據綁定到一個由互斥鎖保護的套接字。在函數中,將要發送的數據添加到套接字的隊列中。檢查套接字是否已分配給一個線程(爲此保留一個標誌)。如果是這樣,你就完成了。如果不是,則將作業安排到線程池以將數據從套接字發送出去。

根據很多細節,您可能更喜歡其他實現。在這個實現中,每個套接字的發送邏輯有兩種模式,排隊和未排隊。套接字開始排隊。當你想發送到套接字時,獲取保護它的鎖。如果它處於排隊模式,則將數據添加到隊列中,然後完成。

如果您處於未排隊模式,請嘗試使用非阻塞發送發送數據。如果你發送所有這些,你就完成了。否則,將未發送的數據保存到隊列中,並將套接字置於排隊模式。

您將需要安排一些機制來'定期'嘗試在隊列模式下在套接字上發送數據。通常情況下,你可以用'select'或'poll'來做到這一點。使用QTcpSockets,你有signals and slots

+0

你好,謝謝你的回答。我認爲你的解決方案非常好,但我不知道如何實施它。假設我的tcpsocket(僅用於讀取)發出readyRead()信號;在單獨的線程中,我將不得不寫入數據以發送到每個寫入套接字的隊列中的所有用戶,然後另一個線程實際上將排隊的數據寫入套接字。我可能會誤解你的解釋...我會盡力實施它,我會發布一些消息... 非常感謝你再次 --Seb-- – Sebastian

相關問題