Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2014, 17:54   #1
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию Очень сложная проблема касающаяся логики отправки данных на сервере

Привет. Абсорбируйтесь! Ну в общем очистите мысли. Теперь смотрите. Есть клиент и сервер. Представте себе, что к серверу подключилось 3 клиента, и клиент номер 1, отправляет запросы на сервер. Запросы бывают трех видов. Первый вид запроса: клиент отправляет данные на сервер, после чего сервер отправляет ответ этому же клиенту. Второй вид: клиент отправляет данные на сервер, после этого сервер отправляет данные всем остальным клиентам, и третий вид: клиент отправляет данные на сервер, но сервер никому ничего не отправляет.
Давайте рассмотрим второй вид запросов. Если у нас 11 клиентов, и одновременно каждый из клиентов отправит запрос на сервер, после этого каждому из клиентов, в маленький промежуток времени придет 10 ответов от сервера. И это очень плохо, я считаю, ибо если будет 100 клиентов, то это что же такое получается, 99 блоков данных за короткое время? Разве клиент сможет нормально справлятся с такой нагрузкой? Да и вообще, зачем 99 раз отправлять данные через одну миллисекунду, например, если можно отправить их все одной кучей за один раз?
Вот тут и начинаются проблемы. Общая схема обработки сообщений на сервере делится на три части. 1 - принятие данных, 2- обработка данных, 3 - отправка ответа. На первом этапе сервер принимает данные от клиента, на втором этапе сервер передает данные в метод-обработчик, который возвращает ответ, а далее проверяется, нужно ли вообще отправлять ответ кому-то, если нужно отправить ответ тому же клиенту, который прислал данные на сервер, то мы передаем сокет клиента и ответ в метод, который и производит отправку данных клиенту, если нужно отправить данные всем остальным клиентам, то в уже другой метод передается список клиентов, клиент приславший данные и данные, которые нужно разослать клиентам, и если ответ не нужно никому отправлять, то мы ничего не делаем и слушаем сокет на предмет поступления новых запросов.
Задача заключается в том, чтобы засовывать все ответы в один буффер, а потом отправлять всё одним разом через определенный промежуток времени, но как же это осуществить? Ведь у нас есть два метода для отправки, один метод отправляет данные одному клиенту, а другой метод отправляет всем остальным, и если я буду просто отправлять весь буффер с данными всем клиентам, то каждый из клиентов получит часть данных, которые ему не предназначены.
p.s. все ответы сервера наследуются от единого интерфейса, поэтому я могу запихивать их в один массив, так же каждый из ответов содержит свой идентификатор, и при поступлении на клиент можно определить, как обарабатывать каждый из полученных ответов
lawliet93 вне форума Ответить с цитированием
Старый 23.02.2014, 18:06   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Абсорбируйтесь! Ну в общем очистите мысли.
1) Абсорбция
2) Абстракция

По теме: а что мешает завести несколько буферов, под разные типы рассылок? Или класть в буфер структуру типа "тело ответа + кому отправить", чтобы знать какое сообщение скольким клиентам переслать?
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 23.02.2014, 18:08   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Привет. Абсорбируйтесь!
Зачетное начьало ))
Цитата:
И это очень плохо
Не понял чем плохо? А если есть сервер, который за очень короткий промежуток времени обрабатывает 10000 запросов и отвечает им всем это хорошо? Это же тоже можно назвать рассылкой "всем" учитывая промежуток времени.
Или по другому: Инфа от клиента для всех записывается в базу (типа e-mail), а клиентам рассылается уведомление "Получите почту". Если клиент соизволяет - запрашивает последнее помеченное как непрочитанное сообщение у сервера.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.02.2014, 18:20   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

а вопрос в чем? хотите закэшировать данные на выходе, ну так в чем проблема? у вас же уже както понимает одному или всем, вот одному не кэшируйте всем можно.
собственно в чем вопрос я не понял...
eval вне форума Ответить с цитированием
Старый 23.02.2014, 18:33   #5
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
1) Абсорбция
2) Абстракция

По теме: а что мешает завести несколько буферов, под разные типы рассылок? Или класть в буфер структуру типа "тело ответа + кому отправить", чтобы знать какое сообщение скольким клиентам переслать?
ну я прост хотел сделать чтобы один был, типа так круче будет... а с телом ответа и кому отпрвить, так это что же получается, есть список с данными, есть список с клиентами, и это в одном цикле перебираем данные, и на каждой итерации перебираем всех клентов и отправляем им данные? тогда же ничего не изменится, каждому клиенту будет приходить по куче сообщений всеравно, просто отправлятся будут чуть по-другому

Цитата:
Сообщение от Stilet Посмотреть сообщение
Зачетное начьало ))

Не понял чем плохо? А если есть сервер, который за очень короткий промежуток времени обрабатывает 10000 запросов и отвечает им всем это хорошо? Это же тоже можно назвать рассылкой "всем" учитывая промежуток времени.
Или по другому: Инфа от клиента для всех записывается в базу (типа e-mail), а клиентам рассылается уведомление "Получите почту". Если клиент соизволяет - запрашивает последнее помеченное как непрочитанное сообщение у сервера.
ну это уже риторика, если бы мне было лень че-то делать, то я бы тоже так подумал, типа все нормально, так и должно быть

Цитата:
Сообщение от eval Посмотреть сообщение
а вопрос в чем? хотите закэшировать данные на выходе, ну так в чем проблема? у вас же уже както понимает одному или всем, вот одному не кэшируйте всем можно.
собственно в чем вопрос я не понял...
ну я тоже так подумал, что типа много отправок идет только если нужно всем отправлять, а если одному, то все ок, просто там же в будущем могут быть еще разные виды отправки, типа отправить сообщение группе из нескольких клиентов, ну знаете, как в играх, бывают группы и гильдии, и есть чат для группы и для гильдии....

Последний раз редактировалось Stilet; 23.02.2014 в 18:56.
lawliet93 вне форума Ответить с цитированием
Старый 23.02.2014, 18:47   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

все равно не понимаю что от форума то хотите? чем вам помочь?
дайте инфу и проблему - помогут (скорее всего), а так поплакать в жилетку не интересно, у каждого есть чем лужу наделать
eval вне форума Ответить с цитированием
Старый 23.02.2014, 18:58   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ну это уже риторика, если бы мне было лень че-то делать, то я бы тоже так подумал, типа все нормально, так и должно быть
Так не же. Я просто хочу понять, почему ты считаешь что это плохо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.02.2014, 19:08   #8
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так не же. Я просто хочу понять, почему ты считаешь что это плохо.
ну может сеть как-то загружается и т.д...... или еще че-то.
upd: я тут так подумал, допустим у пользователя скорость интернета 10 кб/c. У нас есть два ответа по 5кб, и мы можем или сначала отправить один, а потом второй ответ, или сразу два. Так вот на отправку же тоже время какое-то отдается, ведь есть разница, или я: занесу данные в буффер, обращусь к сокету, произведу отправку данных, получу ответ о том, что данные пришли (ну или как там TCP работает), и повторю это еще раз для второго ответа, или я только один раз занесу данные весом в 10кб в буффер и сразу отправлю. То есть в первом случае у нас время подготовки сообщения и отправки по протоколу умножается на два, а во втором только один раз мы все подготавливаем и отправляем, так может в первом случае понадобится больше времени, чтобы переслать два сообщения, суммарный вес которых одинаковый в первом и втором случае? ну вы поняли.

Цитата:
Сообщение от eval Посмотреть сообщение
все равно не понимаю что от форума то хотите? чем вам помочь?
дайте инфу и проблему - помогут (скорее всего), а так поплакать в жилетку не интересно, у каждого есть чем лужу наделать
ну вот я же не знаю, как это реализовать, поэтому спрашиваю. Например, есть 3 клиента. 2 из них отправляют запрос второго вида, то есть ответ должен разослатся другим клиентам. Вот приходит запрос от клиента номер 1, обрабатывается, и мы имеем ответ, который нужно послать клиенту номер 2 и клиенту номер 3. Далее приходит запрос от клиента номер 2, и у нас получается еще один ответ, который нужно отправить клиенту номер 1 и клиенту номер 3. И того, у нас два ответа, один из них должен отправится к 2 и 3, а другой, к 1 и 3, и вот на примере клиента номер 3 мы видим, что мы можем отправить ему сначала первый ответ, а потом второй. Или же мы можем слепить два ответа, и сразу отправить клиенту номер 3 одно сообщение, которое содержит два ответа.

Последний раз редактировалось Stilet; 23.02.2014 в 19:33.
lawliet93 вне форума Ответить с цитированием
Старый 23.02.2014, 19:40   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ну может сеть как-то загружается и т.д...... или еще че-то.
Ну так посмотри хотя бы в диспетчере задач загрузку сети.
Цитата:
Так вот на отправку же тоже время какое-то отдается, ведь есть разница
Фишка в том что каждому подключению создается отдельный сокет. Вернее если быть точным отдельный хендл каждого подключения. Так что сколько бы ты буфера не экономил все равно по твоей схеме растраты средствами самой ОС неизбежна.
Ты же используешь функции записи в сокет, вот скажи как работает та же send()?
Она ведь тоже данные в буфер сокета пишет? А сокет для каждого соединения устраивается. Так что твоя идея а-дя пулл сообщений скорее костыль чем выход.
И потом - C#. Ты же не собираешься писать на этом языке на уровне сокетов Беркли? Сомневаюсь. Все пойдет через дотнет - опять таки его методы можно назвать черезчур расточительными.
Цитата:
То есть в первом случае у нас время подготовки сообщения и отправки по протоколу умножается на два, а во втором только один раз мы все подготавливаем и отправляем, так может в первом случае понадобится больше времени, чтобы переслать два сообщения, суммарный вес которых одинаковый в первом и втором случае? ну вы поняли.
Обычно на каждый запрос-ответ принято заводить отдельный поток, а иногда даже и процесс. Так что вычисление времени тут неуместно, ибо этим уже занимается ОС.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.02.2014, 20:09   #10
lawliet93
Форумчанин
 
Регистрация: 30.08.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну так посмотри хотя бы в диспетчере задач загрузку сети.

Фишка в том что каждому подключению создается отдельный сокет. Вернее если быть точным отдельный хендл каждого подключения. Так что сколько бы ты буфера не экономил все равно по твоей схеме растраты средствами самой ОС неизбежна.
Ты же используешь функции записи в сокет, вот скажи как работает та же send()?
Она ведь тоже данные в буфер сокета пишет? А сокет для каждого соединения устраивается. Так что твоя идея а-дя пулл сообщений скорее костыль чем выход.
И потом - C#. Ты же не собираешься писать на этом языке на уровне сокетов Беркли? Сомневаюсь. Все пойдет через дотнет - опять таки его методы можно назвать черезчур расточительными.

Обычно на каждый запрос-ответ принято заводить отдельный поток, а иногда даже и процесс. Так что вычисление времени тут неуместно, ибо этим уже занимается ОС.
ну блин.. я спрошу у препода тогда
lawliet93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
очень сложная задача! 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