|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
23.02.2014, 17:54 | #1 |
Форумчанин
Регистрация: 30.08.2011
Сообщений: 102
|
Очень сложная проблема касающаяся логики отправки данных на сервере
Привет. Абсорбируйтесь! Ну в общем очистите мысли. Теперь смотрите. Есть клиент и сервер. Представте себе, что к серверу подключилось 3 клиента, и клиент номер 1, отправляет запросы на сервер. Запросы бывают трех видов. Первый вид запроса: клиент отправляет данные на сервер, после чего сервер отправляет ответ этому же клиенту. Второй вид: клиент отправляет данные на сервер, после этого сервер отправляет данные всем остальным клиентам, и третий вид: клиент отправляет данные на сервер, но сервер никому ничего не отправляет.
Давайте рассмотрим второй вид запросов. Если у нас 11 клиентов, и одновременно каждый из клиентов отправит запрос на сервер, после этого каждому из клиентов, в маленький промежуток времени придет 10 ответов от сервера. И это очень плохо, я считаю, ибо если будет 100 клиентов, то это что же такое получается, 99 блоков данных за короткое время? Разве клиент сможет нормально справлятся с такой нагрузкой? Да и вообще, зачем 99 раз отправлять данные через одну миллисекунду, например, если можно отправить их все одной кучей за один раз? Вот тут и начинаются проблемы. Общая схема обработки сообщений на сервере делится на три части. 1 - принятие данных, 2- обработка данных, 3 - отправка ответа. На первом этапе сервер принимает данные от клиента, на втором этапе сервер передает данные в метод-обработчик, который возвращает ответ, а далее проверяется, нужно ли вообще отправлять ответ кому-то, если нужно отправить ответ тому же клиенту, который прислал данные на сервер, то мы передаем сокет клиента и ответ в метод, который и производит отправку данных клиенту, если нужно отправить данные всем остальным клиентам, то в уже другой метод передается список клиентов, клиент приславший данные и данные, которые нужно разослать клиентам, и если ответ не нужно никому отправлять, то мы ничего не делаем и слушаем сокет на предмет поступления новых запросов. Задача заключается в том, чтобы засовывать все ответы в один буффер, а потом отправлять всё одним разом через определенный промежуток времени, но как же это осуществить? Ведь у нас есть два метода для отправки, один метод отправляет данные одному клиенту, а другой метод отправляет всем остальным, и если я буду просто отправлять весь буффер с данными всем клиентам, то каждый из клиентов получит часть данных, которые ему не предназначены. p.s. все ответы сервера наследуются от единого интерфейса, поэтому я могу запихивать их в один массив, так же каждый из ответов содержит свой идентификатор, и при поступлении на клиент можно определить, как обарабатывать каждый из полученных ответов |
23.02.2014, 18:06 | #2 | |
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
|
Цитата:
2) Абстракция По теме: а что мешает завести несколько буферов, под разные типы рассылок? Или класть в буфер структуру типа "тело ответа + кому отправить", чтобы знать какое сообщение скольким клиентам переслать?
Благодарить в репутацию. Проклинать — туда же
|
|
23.02.2014, 18:08 | #3 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
Или по другому: Инфа от клиента для всех записывается в базу (типа e-mail), а клиентам рассылается уведомление "Получите почту". Если клиент соизволяет - запрашивает последнее помеченное как непрочитанное сообщение у сервера.
I'm learning to live...
|
||
23.02.2014, 18:20 | #4 |
Подтвердите свой е-майл
Регистрация: 29.08.2012
Сообщений: 4,011
|
а вопрос в чем? хотите закэшировать данные на выходе, ну так в чем проблема? у вас же уже както понимает одному или всем, вот одному не кэшируйте всем можно.
собственно в чем вопрос я не понял... |
23.02.2014, 18:33 | #5 | ||
Форумчанин
Регистрация: 30.08.2011
Сообщений: 102
|
Цитата:
Цитата:
ну я тоже так подумал, что типа много отправок идет только если нужно всем отправлять, а если одному, то все ок, просто там же в будущем могут быть еще разные виды отправки, типа отправить сообщение группе из нескольких клиентов, ну знаете, как в играх, бывают группы и гильдии, и есть чат для группы и для гильдии.... Последний раз редактировалось Stilet; 23.02.2014 в 18:56. |
||
23.02.2014, 18:47 | #6 |
Подтвердите свой е-майл
Регистрация: 29.08.2012
Сообщений: 4,011
|
все равно не понимаю что от форума то хотите? чем вам помочь?
дайте инфу и проблему - помогут (скорее всего), а так поплакать в жилетку не интересно, у каждого есть чем лужу наделать |
23.02.2014, 18:58 | #7 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
23.02.2014, 19:08 | #8 |
Форумчанин
Регистрация: 30.08.2011
Сообщений: 102
|
ну может сеть как-то загружается и т.д...... или еще че-то.
upd: я тут так подумал, допустим у пользователя скорость интернета 10 кб/c. У нас есть два ответа по 5кб, и мы можем или сначала отправить один, а потом второй ответ, или сразу два. Так вот на отправку же тоже время какое-то отдается, ведь есть разница, или я: занесу данные в буффер, обращусь к сокету, произведу отправку данных, получу ответ о том, что данные пришли (ну или как там TCP работает), и повторю это еще раз для второго ответа, или я только один раз занесу данные весом в 10кб в буффер и сразу отправлю. То есть в первом случае у нас время подготовки сообщения и отправки по протоколу умножается на два, а во втором только один раз мы все подготавливаем и отправляем, так может в первом случае понадобится больше времени, чтобы переслать два сообщения, суммарный вес которых одинаковый в первом и втором случае? ну вы поняли. ну вот я же не знаю, как это реализовать, поэтому спрашиваю. Например, есть 3 клиента. 2 из них отправляют запрос второго вида, то есть ответ должен разослатся другим клиентам. Вот приходит запрос от клиента номер 1, обрабатывается, и мы имеем ответ, который нужно послать клиенту номер 2 и клиенту номер 3. Далее приходит запрос от клиента номер 2, и у нас получается еще один ответ, который нужно отправить клиенту номер 1 и клиенту номер 3. И того, у нас два ответа, один из них должен отправится к 2 и 3, а другой, к 1 и 3, и вот на примере клиента номер 3 мы видим, что мы можем отправить ему сначала первый ответ, а потом второй. Или же мы можем слепить два ответа, и сразу отправить клиенту номер 3 одно сообщение, которое содержит два ответа. Последний раз редактировалось Stilet; 23.02.2014 в 19:33. |
23.02.2014, 19:40 | #9 | |||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
Ты же используешь функции записи в сокет, вот скажи как работает та же send()? Она ведь тоже данные в буфер сокета пишет? А сокет для каждого соединения устраивается. Так что твоя идея а-дя пулл сообщений скорее костыль чем выход. И потом - C#. Ты же не собираешься писать на этом языке на уровне сокетов Беркли? Сомневаюсь. Все пойдет через дотнет - опять таки его методы можно назвать черезчур расточительными. Цитата:
I'm learning to live...
|
|||
23.02.2014, 20:09 | #10 | |
Форумчанин
Регистрация: 30.08.2011
Сообщений: 102
|
Цитата:
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
очень сложная задача! | extrayellow | Microsoft Office Excel | 1 | 19.11.2012 22:34 |
Очень сложная задача! | XYLIGAN72 | Помощь студентам | 8 | 30.01.2012 14:09 |
Очень сложная задача на Pascal ABC! | d00ker | Помощь студентам | 8 | 11.02.2009 22:02 |
Очень сложная задача, помогите решить... | jaw | Помощь студентам | 17 | 25.10.2008 22:02 |