Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[c#] Server / Client (на асинхронных сокетах) сигналы оповещения

18K
23 января 2012 года
imAlex
179 / / 29.07.2010
Доброго времени.
Хочу к своей программе прикрутить систему оповещения. Ну например при добавлении новой информации, все кто подключен должны получить сообщение: "Новость". Сейчас принцип работы сервера:
- ждет подключение;
- подключает к себе желающего пользователя (дополняется список коннектов);
- ждет сообщение, обрабатывает его и возвращает результат;
клиент:
-отправляет сообщение;
-получает результат.

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

Интересно, как это реализовано в ICQ и ему подобных?
Кто сталкивался с подобной задачей? Как ее лучше решить?
277
24 января 2012 года
arrjj
1.7K / / 26.01.2011
Сокеты же асинхронные используешь.
А ты с ними работаешь как с синхронными.
18K
24 января 2012 года
imAlex
179 / / 29.07.2010
ммм. Как-то я не совсем понял. Данный раздел MSDN-а я упорно штудировал, но не нашел там ответа. Там написано, что клиент должен в отдельном потоке принимать и отправлять данные, однако ничего не сказано про постоянное ожидание клиентом сообщения. То-есть в отдельном потоке можно ждать сообщения, но если необходимо будет осуществить передачу, то придется разрушить поток. Я что-то не правильно понял?
277
24 января 2012 года
arrjj
1.7K / / 26.01.2011
Тут ReceiveCallback.
18K
24 января 2012 года
imAlex
179 / / 29.07.2010
)))
Я действительно благодарен за данные ссылки и желание помочь, но я не могу понять в чем я не прав. Там написано "One thread is responsible for initiating the sending or receiving of data; other threads complete the connection to the network device and send or receive the data." В примерах разбирается вариант, когда надо либо отправить сообщение без ответа, и пример когда ожидается ответ. Хотя отправка и получение осуществляется в отдельном потоке, но инициализируется из основного. Соответственно пока поток не вернет результат, программа не продолжится. У меня все именно так и организовано. А мне необходимо иметь по мимо такой структуры еще нечто, что позволит мне все время ждать сообщения со стороны сервера.
277
24 января 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: imAlex
Соответственно пока поток не вернет результат, программа не продолжится. У меня все именно так и организовано.



Не нужно самому распараллеливать на потоки.
Нужно использовать AsyncCallback для методов сокета.

18K
24 января 2012 года
imAlex
179 / / 29.07.2010
Я еще раз перечитал данный материал, посмотрел свою прогу и понял, что у меня серверная часть написана на асинхронных сокетах, а клиентская на синхронных. Придется переписывать.
Прошу прощения за то, что ввел вас в заблуждение.
Попутно возник вопрос: "А асинхронный сервер при приеме данных от разных клиентов обрабатывает их по очереди?" Сейчас строчку выписать не могу (потерял), но читал про то, что сервером входные данные должны быть обработаны как можно быстрее, дабы не задерживать остальных желающих. С этих слов, я так понял, данные обрабатываются по очереди. Плюс сама структура
 
Код:
private void ReceiveCallback(IAsyncResult result)
        {
            ConnectionInfo connection = (ConnectionInfo)result.AsyncState;
            try
            {
                connection.bytesRead = connection.Socket.EndReceive(result);
                if (0 != connection.bytesRead)
                {
                    lock (_connections)
                    {

говорит о временной блокировке.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог