|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.11.2012, 17:25 | #1 |
Пользователь
Регистрация: 09.03.2010
Сообщений: 48
|
Socket-ы и многопоточность
Всем привет!
Писал я тут приложеньице клиент-серверное, суть которого от клиента собрать инфу и передать ее на сервер, а на сервере обработать и вернуть клиенту ответ. Так вот, использовал сокеты в режиме stNonBlocking ибо очень мал объем запросов и клиентов онлайн. Теперь задача усложнилась- клиентов в разы больше и запросов прилетает, соответственно, больше. Начал курить в сторону stThreadBlocking. Но не понимаю до конца, и найти не могу толкового описания. По сути, вопрос касается сервера. Цель: держать онлайн подключенными минимум 20-200 клиентов (в последствии минимум станет равен 1000+), причем они могут в любой момент прислать запрос и его надо не потерять и вовремя ответить на него. Представляю себе это так: При подключении каждого клиента к сокету создается отдельный поток (по onGetThread), в Execute которого происходит исполнение инструкций, соответствующих открытию подключения (логирование и т.п.). Затем мне нужно как-то получать инфу от клиента. \\\\ В режиме stNonBlocking все просто делалось- на onClientRead вешался обработчик и все хорошо работало \\\\\ Как повесить обработчик в реализации потока? Я так предполагаю, что нужно в потоке ждать прихода этого сообщения, но непойму как. Т.е. я понимаю, что нужно периодически поток пробуждать и проверять пришло ли что-то и уже дальше обрабатывать. Или тут я не правилно представляю? И также меня мучает вопрос как мне всего многообразия клиентских потоков выбирать, тот, которому я должен отправить ответ. \\\\ В предыдущей реализации я по имени хоста определял адресата. \\\\ И как тут делается отправка? Для ясности общая схема работы сервера такова: Сообщения от клиента складываются в общую очередь на обработку. Я имею отдельный специальнообученый поток для работы с этой очередью и данными в ней- передача в БД и исключение переданного элемента из очереди. Также я имею специальный отдельный поток для забора информации из БД и ее помещения в другую специальную очередь. Тут содержатся ответы на сообщения клиентов. Еще у меня поток есть, который обрабатывает очередь с ответами для клиентов и рассылает их нужным клиентам. Собственно именно эту конструкцию мне необходимо подружить с потоками сокета. Более того, я допускаю, что сокеты тут могут и отпасть в виду невозможности реализации чего-то из требуемого. Если это так- прошу порекомендовать адекватную замену с функционалом сокета+ требуемое дополнительно. И еще- прошу не отправлять в гугл, не выдавать "стопицот раз обсуждалось" и т.п. Количество моих сообщений на форуме говрит не о том, что я мало тут появляюсь, а о том, что я умею читать и понимать. И если я не понимаю и не могу вычитать\найти пример-прошу помочь участников форума. Спасибо за понимание и помощь! жду с нетерпением |
24.11.2012, 22:06 | #2 | |
Форумчанин
Регистрация: 11.04.2012
Сообщений: 212
|
Цитата:
либо см. TWinSocketStream |
|
28.11.2012, 12:10 | #3 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
На 1000+ клиентов stThreadBlocking не потянет, не хватит памяти
от 0 до 500 вполне работоспособно и пишется многократно проще чем stNonBlocking пример Эха Код:
Не стесняемся, плюсуем!
Последний раз редактировалось Slym; 28.11.2012 в 15:08. |
28.11.2012, 12:13 | #4 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
а проще stThreadBlocking потому что в потоке ты один на один с конкретным клиентом поток ждет посылки от клиента и ждет пока ответ не уйдет... все строго линейно как readln(s);writeln(s); безсобытийно. Вышел из потока - соединение разорвал. Для новичков я советую именно stThreadBlocking
Не стесняемся, плюсуем!
|
06.12.2012, 09:22 | #5 |
Пользователь
Регистрация: 09.03.2010
Сообщений: 48
|
Код:
или при таком варианте ClientSocket.Connected останется true т.к. клиент остается подключенным? |
06.12.2012, 11:07 | #6 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
ClientSocket.Connected станет false и поток завершится...
можно тупо завершить поток breakом тогда перед своей смертью поток сам отдисконектит сокет
Не стесняемся, плюсуем!
|
20.12.2012, 16:05 | #7 |
Регистрация: 20.12.2012
Сообщений: 7
|
Я пользовался для разработки следующим примером: http://softengines.ru/showthread.php?t=6863
Кстати, у меня есть вопросы по поводу обработки и корректного закрытия соединения. Кто может, ответьте, пожалуйста. Создал тут тему: http://programmersforum.ru/showthread.php?p=1154481 |
20.12.2012, 19:47 | #8 |
Форумчанин
Регистрация: 31.05.2011
Сообщений: 301
|
Не осилил первый пост, слишком много букв, посмотри исходник.
|
19.04.2013, 16:27 | #9 | |
Пользователь
Регистрация: 09.03.2010
Сообщений: 48
|
Привет!
Посмотрел, повертел. Пытаюсь внедрить в свой проект. в var добавляю Код:
Код:
ну и на кнопку активации сокета прописываю Код:
Цитата:
Код:
Не понимаю какую переменную он хочет тут видеть? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Многопоточность | lalilulelo | Операционные системы общие вопросы | 20 | 16.04.2012 19:33 |
многопоточность | MasterSporta | Общие вопросы C/C++ | 4 | 30.09.2011 13:27 |
Многопоточность и с++ | Koshmarovsky | Visual C++ | 13 | 06.09.2010 20:39 |
Многопоточность | kroŧ | Общие вопросы Delphi | 5 | 21.06.2010 10:47 |
Многопоточность | CrazyDude | Общие вопросы Delphi | 1 | 18.04.2010 19:00 |