Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# .NET

Войти
Регистрация
Восстановить пароль
 
Nowsoud
1 / 1 / 0
Регистрация: 01.01.2015
Сообщений: 85
#1

Ответ от асинхронного сервера - C#

04.07.2015, 00:07. Просмотров 368. Ответов 5
Метки нет (Все метки)

Добра.

Решил написать асинхронный сервер. Сначала полёт был отличный.
Писал опираясь на статью
(Почти копипаста)
Всё работает шикарно:
Клиент подключился - Прочитали его запрос - дали ответ - закрыли сокет.
C#
1
2
handler.Shutdown(SocketShutdown.Both);
handler.Close();
И так по кругу.

Ок. А что делать, если потом серверу нужно отправить клиенту данные, даже если клиент не подключался заново и ничего не просил?
Может можно как-то опять открыть сокет, или его вообще не закрывать?
Если не закрывать, то как это должно работать, ведь handler.BeginReceive вызывается только в AcceptCallback.

Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2015, 00:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ответ от асинхронного сервера (C#):

Завершение асинхронного сервера - C#
Есть форма в которой асинхронный сервер запускается и останавливается. Когда нажимаю старт сервер запускается, всё написано так: public...

Реализация асинхронного клиента и сервера - C#
Пытался сделать следующее: Клиент подключается к серверу и все время прослушивает его до тех пор, пока в форме не введут сообщение и...

.NET 4.x Создание асинхронного сервера на основе сокетов с пользователями - C#
Давно курю эту тему... Смысл в том, что мне нужно написать асинхронный сервер на сокетах (System.Net.Sockets). Как это сделать я, в...

Получить ответ от сервера - C#
Добрый день! У меня возник еще один вопрос. Пишу программу которая авторизовывается на одном сайте. Заполняю HTTP заголовок так же, как...

Получить ответ от сервера - C#
Что за команда в HttpWebRequest, при помощи которой можно узнать код ответа от сервера. По поводу HtmlAgilityPack. Если на странице...

.NET 4.x Как отловить ответ сервера (Awesomium 1.7) - C#
Всем доброго дня! Есть тут люди, познавшие awesomium? При авторизации на одном сайте, браузер автоматом отправляет несколько Post...

5
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
04.07.2015, 02:22 #2
Добрый вечер,

Советую почитать мой блог, думаю найдете там ответы.
1
Anklav
436 / 294 / 22
Регистрация: 23.01.2013
Сообщений: 624
Завершенные тесты: 2
04.07.2015, 14:29 #3
Nowsoud, не только в AcceptCallback, он также вызывается еще в ReceiveCallback, если строка не получена полностью.

C#
1
2
3
4
5
6
7
8
9
10
11
            if (content.IndexOf("<EOF>") > -1) {
                // All the data has been read from the 
                // client. Display it on the console.
                Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
                    content.Length, content );
                // Echo the data back to the client.
                Send(handler, content);
            } else {
                // Not all data received. Get more.
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); // <-- Вот тут
            }
Если вы хотите не закрывать соединение достаточно вызвать BeginReceive всегда. А не только тогда, когда строка не получена полностью.

Пример реализации такого соединения можно глянуть здесь (реализация работает с передачей бинарных данных, а не строк) https://github.com/Nirklav/TCPChat/b.../Connection.cs
1
Nowsoud
1 / 1 / 0
Регистрация: 01.01.2015
Сообщений: 85
04.07.2015, 19:35  [ТС] #4
Anklav, в таком случае, после отправки сервером ответа, сокет просто не закрывать, а вызывать ReceiveCallback? Так сервер будет держать постоянное соединение со всеми подключёнными клиентами. Значит ли это, что для каждого, как и в синхронной модели, будет выделен отдельный поток, что вызовет трудности при 1000+ одновременно подключенных клиентах?

Добавлено через 6 минут
Я к тому, что в ISQ, к примеру, клиент же не прозванивает сервер постоянно, в ожидании новых сообщений.
Если сообщение приходит - сервер сам как-то посылает его клиенту, так?
0
Anklav
436 / 294 / 22
Регистрация: 23.01.2013
Сообщений: 624
Завершенные тесты: 2
04.07.2015, 22:04 #5
Nowsoud, нет, при асинхронной передачи данных, должны создаваться IO потоки в крайнем случае будет использован пул потоков, и никакой 1000 не будет.

Цитата Сообщение от Nowsoud Посмотреть сообщение
Если сообщение приходит - сервер сам как-то посылает его клиенту, так?
Что конкретно в ISQ - не знаю, но думаю - да. Иначе сервер будут либо спамить, либо ответы будут идти слишком долго.
1
Nowsoud
1 / 1 / 0
Регистрация: 01.01.2015
Сообщений: 85
05.07.2015, 14:08  [ТС] #6
Ок. Спасибо. Буду пробовать.
0
05.07.2015, 14:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2015, 14:08
Привет! Вот еще темы с ответами:

Получить ответ сервера с помошью HttpWebResponse - C#
Здравствуйте! Возможно, сказывается то, что уже даже не ночь и мозги не варят, но столкнулся с проблемой. У меня есть массив byte в...

Если ответ от сервера не пришел в течении 45 секунд то - C#
Нужно сделать так: Отсылаем реквест.Если через 45 секунд ответ не пришел или пришел,но плохой,значит пишем в лист бокс: не удалось. ...

Текстбокс неправильно отображает кириллицу (Ответ от сервера) - C#
ель ВКонтаР- Пишет, что то на подобии этого, когда в нем отображаю ответ от сервера :( Как исправить?

POST запрос: иногда приходит пустой ответ от сервера - C#
Отсылаю POST запрос(HttpWebRequest) , использую прокси(запрос на pw.mail.ru) и очень часто ответ пустой. С чем связано - не пойму. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru