Как стать автором
Обновить

Комментарии 13

Что ж, гораздо лучше, чем предыдущий «сервер на Qt»!
Но, опять таки, где же потоки? Тут достаточно было бы MyClient унаследовать от QThread и всю работу поместить в run().

Из замечаний не по серверу: строки для экономии лучше передавать как const QString & — для избежания лишнего копирования. Если сервер будет хорошо нагружен, то это может оказаться важным.
(да, я знаю, что строки в Qt копируются только при необходимости и обычный copy-ctor работает за константное время, но это время на сервере тоже иногда имеет смысл экономить)
На счет потоков — стоит ли так делать для чата даже не знаю, в таком случае в памяти будет висеть (даже не просто висеть, а кушать время процессора?) столько потоков, сколько есть активных подключений, даже если нету активности (никто ни кому ничего не пишет).
Это если реализовывать поток как конечный автомат — но ведь можно и иначе, поток запускать только при активности, если активность высокая, то можно его и всё время в памяти держать.

Есть и другой вариант (самый, на мой взгляд, интересный) — создать столько потоков, сколько ядер в системе, и перераспределять между ними нагрузку.

Без потоков, мне кажется, не обойтись, если хочешь сделать высоконагруженный сервер.
Если дефицит — процессор, да нужны потоки. Иначе не нужны. Это чат, нагрузка на проц отстуствует. Вывод — потоки не нужны.
Потоки там не нужны, не такая большая нагрузка. В свое время делал лабу (тоже клиент-сервер чат), чистое WinAPI, вместо GUI использовал CUI, где-то даже еще хранится. Для обработки подключений использовал динамический pool потоков. В итоге максимум было 2 активных потока.
Везет Вам с лабами по Qt…
Вообще-то лабы не по Qt, у нас в универе 70% всего ориентируется на Delphi, но я с ним не хочу дружить…
СДЕЛАЛ ЛАБУ @ ВЫЛОЖИ НА ХАБР
может стоить завести блог «о Qt для новичков»?

P.S.
> QTcpSocket *_sok; //сокет
> //создаем сокет
> _sok = new QTcpSocket(this);

Капитан очевидность одобряет.
Копипаста — это плохо. У вас например doSendToAllServerMessage отличается от doSendToAllMessage менее чем одной строчкой. Как и doSendToAllUserJoin от doSendToAllUserLeft. Ну и первые два от вторых двух тоже отличаются минимально.

Чем добавление сервера в друзья к клиенту лучше добавления одного простенького метода MyClient::write(const QByteArray&) — тоже не очень понятно.
Кстати, чтобы код нормально работал под qt >= 5.0.1, нужно в myserver.h и myserver.cpp заменить сигнатуру
void incomingConnection(int handle);

на сигнатуру
void incomingConnection(qintptr handle);

Описание проблемы есть вот тут.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации