private void ReceiveCallback(IAsyncResult result)
{
ConnectionInfo connection = (ConnectionInfo)result.AsyncState;
try
{
connection.bytesRead = connection.Socket.EndReceive(result);
if (0 != connection.bytesRead)
{
lock (_connections)
{
[c#] Server / Client (на асинхронных сокетах) сигналы оповещения
Хочу к своей программе прикрутить систему оповещения. Ну например при добавлении новой информации, все кто подключен должны получить сообщение: "Новость". Сейчас принцип работы сервера:
- ждет подключение;
- подключает к себе желающего пользователя (дополняется список коннектов);
- ждет сообщение, обрабатывает его и возвращает результат;
клиент:
-отправляет сообщение;
-получает результат.
Соответственно просто послать сообщение со стороны сервера я не могу, так-как клиент его получит только тогда, когда будет ждать ответа.
Мне в голову приходит несколько вариантов:
1) Периодически спрашивать у сервера есть ли сообщение для клиента.
2) Вынести на клиенте сокет в отдельный поток, все время ждать сообщения от сервера, а когда надо передать сообщение- уничтожать поток, передавать сообщение и снова поднимать поток.
3) При подключении организовывать еще одно соединение, только на оборот (сервер станет клиентом, а клиент-сервером). В отдельном потоке работать с приходящими сигналами (данными).
Интересно, как это реализовано в ICQ и ему подобных?
Кто сталкивался с подобной задачей? Как ее лучше решить?
асинхронные используешь.
А ты с ними работаешь как с синхронными.
Сокеты же
А ты с ними работаешь как с синхронными.
ммм. Как-то я не совсем понял. Данный раздел MSDN-а я упорно штудировал, но не нашел там ответа. Там написано, что клиент должен в отдельном потоке принимать и отправлять данные, однако ничего не сказано про постоянное ожидание клиентом сообщения. То-есть в отдельном потоке можно ждать сообщения, но если необходимо будет осуществить передачу, то придется разрушить поток. Я что-то не правильно понял?
Тут ReceiveCallback.
Я действительно благодарен за данные ссылки и желание помочь, но я не могу понять в чем я не прав. Там написано "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." В примерах разбирается вариант, когда надо либо отправить сообщение без ответа, и пример когда ожидается ответ. Хотя отправка и получение осуществляется в отдельном потоке, но инициализируется из основного. Соответственно пока поток не вернет результат, программа не продолжится. У меня все именно так и организовано. А мне необходимо иметь по мимо такой структуры еще нечто, что позволит мне все время ждать сообщения со стороны сервера.
Цитата: imAlex
Соответственно пока поток не вернет результат, программа не продолжится. У меня все именно так и организовано.
Не нужно самому распараллеливать на потоки.
Нужно использовать AsyncCallback для методов сокета.
Прошу прощения за то, что ввел вас в заблуждение.
Попутно возник вопрос: "А асинхронный сервер при приеме данных от разных клиентов обрабатывает их по очереди?" Сейчас строчку выписать не могу (потерял), но читал про то, что сервером входные данные должны быть обработаны как можно быстрее, дабы не задерживать остальных желающих. С этих слов, я так понял, данные обрабатываются по очереди. Плюс сама структура
Код:
говорит о временной блокировке.