Как писать на нескольких QTcpSockets, используя QThreads? - PullRequest
1 голос
/ 05 ноября 2011

Я уже пару дней бьюсь над этой проблемой в QTcpSockets и QThreads.

У меня есть QTcpServer, который прослушивает порт и создает нового клиента, используя nextPendingConnection ().Итак, теперь у клиента есть qtcpsocket, который я могу использовать для чтения и записи.

Предположим, у меня есть 100 клиентов, подключенных к моему серверу.Когда один из них хочет передать сообщение всем, мой основной поток (где я создаю клиентов с помощью nextPendingConnection ()) должен будет перебрать более 100 клиентов и вызвать метод write для их сокетов.Если, например, 10 пользователей одновременно вещают, мне придется сделать 1000 итераций, поэтому, по моему мнению, на стороне клиента будет некоторая задержка (когда пользователь получит сообщения).

Я бы хотелделать все записи сокетов в отдельных потоках, чтобы я мог отправлять данные в параллельном режиме.Я знаю, что не могу вызвать сокет из другого потока из того, в котором он был создан, и я не хочу использовать один поток для каждого клиента, потому что я не знаю, хорошо ли иметь много потоков(кроме того, эти потоки должны работать всегда, пока клиент не отключится).

Я прочитал пример сервера thread удачи, но он не отвечает на мою проблему, потому что они разрушают сокет после отправки данных;Я не хочу разрушать свой сокет, потому что я должен прослушивать его для входящих сообщений (чтобы я мог их транслировать).

Одна вещь, о которой я подумал, - это иметь 2 сокета для каждого клиента (насервер и на стороне клиента);так что я оставляю один сокет для чтения, а другой могу использовать как в примере с сервером потока удачи;в этом случае я бы также использовал пул потоков, чтобы ограничить количество задач (в противном случае это было бы то же самое, что использование одного потока на клиента).

Не могли бы вы указать мне правильное направление или дать мненекоторые подсказки о том, как реализовать запись сокета paralel без фактического использования одного потока на клиента ...?

С наилучшими пожеланиями,

Себастьян

1 Ответ

0 голосов
/ 05 ноября 2011

Имеет функцию WriteToSocket, которая записывает данные в конкретный сокет. Кроме того, есть очередь, которая содержит данные, связанные для сокета, защищенного мьютексом. В функцию добавьте данные, которые вы хотите отправить в очередь для сокета. Проверьте, назначен ли сокет потоку (для этого сохраните флаг). Если так, то все готово. Если нет, запланируйте задание в пул потоков для отправки данных из сокета.

В зависимости от множества деталей, вы можете предпочесть альтернативную реализацию. В этой реализации логика отправки для каждого сокета имеет два режима: в очереди и без очереди. Розетки начинаются без очереди. Если вы хотите отправить в сокет, приобретите блокировку, которая защищает его. Если он находится в режиме очереди, добавьте данные в очередь, и все готово.

Если вы находитесь в режиме без очереди, попробуйте отправить данные с неблокирующей отправкой. Если вы отправите все это, все готово. В противном случае сохраните неотправленные данные в очередь и переведите сокет в режим ожидания.

Вам нужно будет организовать какой-то механизм, чтобы «периодически» пытаться отправлять данные на сокеты в режиме очереди. Обычно это можно сделать с помощью команды «выбрать» или «опрос». С QTcpSockets у вас есть сигналов и слотов .

...