在QTcpSockets和QThreads上,我一直在努力掙扎幾天。如何使用QThreads寫入多個QTcpSockets?
我有一個QTcpServer在一個端口上偵聽並使用nextPendingConnection()創建一個新的客戶端。所以現在客戶端有一個我可以用來讀寫的qtcpsocket。
假設我有100個客戶端連接到我的服務器。當他們中的一個想要向每個人廣播一條消息時,我的主線程(在我使用nextPendingConnection()創建客戶端的地方)將不得不迭代超過100個客戶端並在它們的套接字上調用write方法。例如,如果10個用戶同時廣播,我將不得不進行1000次迭代,所以在我看來,客戶端會有一些延遲(當用戶收到消息時)。
我想做所有的套接字寫在分離線程,以便我可以發送數據並列。我知道我不能從創建它的另一個線程中調用一個套接字,並且我不想爲每個客戶端使用一個線程,因爲我不知道是否有好多線程(此外,這些線程應該始終運行,除非客戶端斷開連接)。
我讀過線程財富服務器的例子,但它不回答我的問題,因爲它們在發送數據後銷燬套接字;我不想摧毀我的套接字,因爲我必須爲它收聽消息(所以我可以廣播它們)。
我想過的一件事是每個客戶端(在服務器和客戶端)有2個套接字;這樣我就可以保留一個讀取套接字,另一個我可以像線程財富服務器示例中一樣使用;在這種情況下,我還會使用一個線程池來限制任務的數量(否則它將與每個客戶端使用一個線程的情況相同)。
請你指點我正確的方向或給我一些提示,說明如何實現並行套接字寫入,而不需要每個客戶端都有一個線程......?
最好的問候,
塞巴斯蒂安
你好,謝謝你的回答。我認爲你的解決方案非常好,但我不知道如何實施它。假設我的tcpsocket(僅用於讀取)發出readyRead()信號;在單獨的線程中,我將不得不寫入數據以發送到每個寫入套接字的隊列中的所有用戶,然後另一個線程實際上將排隊的數據寫入套接字。我可能會誤解你的解釋...我會盡力實施它,我會發布一些消息... 非常感謝你再次 --Seb-- – Sebastian