|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.08.2008, 20:14 | #1 |
Регистрация: 14.08.2008
Сообщений: 8
|
Многопоточное соединение сервер-клиент
Здравствуйте! Читаю форум, и вижу, что всем помогают, от простых вопросов до самых сложных.... Сидел, мучился в одиночку и вот решил спросить, мб и мне кто пожет. Итак, Сабж.
Есть сервер-клиент соединение основанное на TSocketServer/Client. В клиент вшита мат. машина, но к делу это не относится. После подключения, пользователь получает список подруженных баз. После нажатия на OK по таймеру(например раз в 2 секунды) начинает идти строка для расчета(с сервера на клиент). Далее пользователь жмет на запуск подачи данных со второй базы. И вот тут загвоздка. Например на сервере есть готовыепотоки M1 :=TMemoryStream; M2 :=TMemoryStream; Далее по запросу SendStream(m1); Пришел Второй запрос: SendStream(M2); На буфере клиента будет свалка.Индексировать перед отправкой тоже тупо. Задача такая send ServerStream(M1)--->ClientStream1; Send ServerStream(M2)-->ClientStream2; Почему тупо индексировать данные? Во-первых это нужно знать уникальные ключи сервера. Во вторых поток придется разбирать и проверять/разбивать по ключам=> Времени будет тратится много а толку нет. Вот например как инетовские качалки пашут? Скажем ReGet, DM, FlashGet? В процессе активной закачки в один поток можно добавить еще один поток. Можно его отключить при этом данные не потеряются.=> Если там все таки ключи какие-нить, то Должны быть госты, по которым весь мир ключи эти генерит. Хотя мне почему то кажется что это делается многопоточным соединением. Вот если бы два клиента было, тогда понятно. После подключения в массив коннектов вводится номер машины-клиента. Но клиент то один. И процедура SendStream тоже одна.=( Жду предложений от экспертов. |
14.08.2008, 21:17 | #2 |
Форумчанин
Регистрация: 22.11.2007
Сообщений: 224
|
Используй Indy компоненты IdTCPServer\Client.
Там принцип работы другой--пока не обработана предыдущая комманда, следующая не выполняется, если я не ошибаюсь. Последний раз редактировалось NikLik; 14.08.2008 в 21:49. |
15.08.2008, 03:41 | #3 |
Регистрация: 14.08.2008
Сообщений: 8
|
Если я правильно понял ваш ответ
то чем мне это поможет? Мне как раз таки надо одновременно в разные стримы гнать на клиенте. Или вы к тому, что там так и можно гнать просто не будет свалки на потоке клиента? Если можно с примером, для наглядности. |
15.08.2008, 08:16 | #4 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
По-моему можно создать отдельный TClientSocket для каждого потока/запроса. Пример передачи двух потоков:
|
15.08.2008, 09:12 | #5 |
Старожил
Регистрация: 13.12.2006
Сообщений: 3,859
|
в подобном случае проще организовывать такую схему: опишу на примере Indy (при реализации с TclientSocket и TserverSocket реализовывается аналогично):
Сервер TidTcpServer, к оторому подсоединяется некий сервер и отправляет некую комманду, по которой в обработчике onexecute вы, распарсив и проанализировав комманду создаете сторонний поток, в котором в run-time создаете TcpClient , с помощью которого отправляете необходимые вам данные. На другой стороне будет корректно также использовать TcpClient для подключения к серверу и отправки комманд и TidTcperver для приема получаемых данных, в этом случае все получаемые данные будут автоматически получаться в отдельных потоках (только в Indy , TserverSocket многопоточность реализовывайте ручками). подобный метод будет держать достаточное кол-во одновременных потоков. По поводу кол-ва почитайте этот раздел, эта тема уже поднималась.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи |
15.08.2008, 16:36 | #6 |
Регистрация: 14.08.2008
Сообщений: 8
|
Не знаю как правильнее было бы сделать но идея alexBlack`а мне понравилась. Модифицировав, можно опросить массив соединений на сервере. Потестил, реально работает, спасибо=) Хотя этот метод достаточно сильно грузит( ведь по сути это создание виртуальных клиентов), в моем случае это не критично т.к. у меня система работать будет от 1-го до 8 потоков. Крайний(пиковый) режим 50 потоков.
Стало интересно, а downloader`ы инетовские типо FlashGet и т.п. так же работают? Просто они запрашивают размер файла, делят его на количество потоков и смещают TStream.Seek? или там какие то другие замутки? Квэнди впринципе как я понял ваш метод в чем то похож на метод alexBlack`а. Та же run-time генерация. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Клиент-сервер-клиент | Кронос | Работа с сетью в Delphi | 3 | 24.08.2007 07:57 |
Клиент-Сервер | snakesoft | Работа с сетью в Delphi | 8 | 20.07.2007 17:34 |
клиент сервер | Oksana1988 | Фриланс | 3 | 10.04.2007 12:12 |
Клиент-сервер | Scorpio | Работа с сетью в Delphi | 6 | 13.02.2007 22:57 |