QTcpSockets と QThreads でこの問題に数日間苦労しています。
ポートをリッスンし、nextPendingConnection() を使用して新しいクライアントを作成する QTcpServer があります。これで、クライアントには読み取りと書き込みに使用できる qtcpsocket ができました。
サーバーに 100 のクライアントが接続されているとします。それらの 1 つが全員にメッセージをブロードキャストしたい場合、私のメイン スレッド ( nextPendingConnection() でクライアントを作成する場所) は、100 を超えるクライアントを反復処理し、ソケットで書き込みメソッドを呼び出す必要があります。たとえば、10 人のユーザーが同時にブロードキャストする場合、1000 回の反復を行う必要があるため、クライアント側 (ユーザーがメッセージを受信するとき) に遅延が生じると考えられます。
データを並列で送信できるように、すべてのソケット書き込みを別々のスレッドで行いたいと思います。ソケットが作成されたスレッドから別のスレッドからソケットを呼び出すことはできないことを知っています。多くのスレッドを持つことが良い考えかどうかわからないため、クライアントごとに 1 つのスレッドを使用したくありません。 (さらに、クライアントが切断しない限り、これらのスレッドは常に実行されている必要があります)。
スレッド フォーチュン サーバーの例を読みましたが、データの送信後にソケットが破棄されるため、問題の解決にはなりません。受信メッセージをリッスンする必要があるため(ブロードキャストできるようにするため)、ソケットを破壊したくありません。
私が考えたことの 1 つは、各クライアント (サーバー側とクライアント側) に 2 つのソケットを用意することです。1 つのソケットを読み取り用に保持し、もう 1 つのソケットをスレッド フォーチュン サーバーの例と同じように使用できるようにします。この場合、スレッドプールを使用してタスクの数を制限します (それ以外の場合は、クライアントごとに 1 つのスレッドを使用するのと同じことになります)。
正しい方向を教えてください。または、実際にクライアントごとに 1 つのスレッドを持たずに並列ソケット書き込みを実装する方法についてのヒントを教えてください...?
よろしくお願いします、
セバスチャン