Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.189.177] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток всем обратившим внимание.
Ситуация: постоянно нужно проверять сервер (прога на основе TcpListener) не отправил ли он чего нового через NetworkStream, сервер может быть запущен, а может и не запущен. Вот когда он не запущен, следующий код (выполняется каждые пол-секунды) private TcpClient client = new TcpClient(); ... public void Call() { try { if (!client.Connected) client.Connect(computerName, 6007); if (client.Connected) { ... } } catch (Exception ex) { ... } } тормозит всё приложение, несмотря на то, что метод Call() запускается в отдельном потоке. Ясно, что всё дело в том, что при выключенном сервере, постоянно генерится исключение и из-за него прога вешается. Но как, блин, по другому организовать постоянный опрос сервера (или какую-нибудь шуструю проверку up сервак или down по такому-то IP/порту) я не допер. Буду очень признателен, если кто подскажет как можно выкрутиться. |
Сообщ.
#2
,
|
|
|
это получается что ты просто каждые пол секунды создаешь коннект к серверу и разрываешь его, смысл ?
Если ты так часто общаешься со своим сервером, то уж создай коннект и просто постоянно слушай что скажет тебе твой сервер |
Сообщ.
#3
,
|
|
|
Pit-Bul читай вопросы...
Цитата Pit-Bul @ Но как, блин, по другому организовать постоянный опрос сервера под этим понимается проверка на доступность сервера? |
Сообщ.
#4
,
|
|
|
Socket.Select не поможет? Юзал его на стороне сервера для проверки активности клиентов.
|
Сообщ.
#5
,
|
|
|
Цитата Pit-Bul @ это получается что ты просто каждые пол секунды создаешь коннект к серверу и разрываешь его, смысл ? Если ты так часто общаешься со своим сервером, то уж создай коннект и просто постоянно слушай что скажет тебе твой сервер ОК, допустим запускаем клиент, сервер при этом не запущен, соответственно непрерывно читать данные никак. Нужно будет оперативно отловить момент, что сервер запустился и считать данные, а как ? Сервер у меня просто мое приложение, на основе TcpListener Добавлено Цитата FlyDead @ под этим понимается проверка на доступность сервера? Очень корректный вопрос, сорри что сразу не пояснил. Под этим подразумевается, запущен ли мой "сервер" (просто прога на основе TcpListener) или нет. То есть проверять нужно по IP/порту. Или какой то другой способ есть ? |
Сообщ.
#6
,
|
|
|
Вот тебе тупое решение:
Сделай у клиента UDPServer, который будет слушать порт, а у сервера UDPClient, который будет слать сообщение "вот, я ожил"! Может и криво, но работать будет. |
Сообщ.
#7
,
|
|
|
Цитата wdk @ Socket.Select не поможет? Юзал его на стороне сервера для проверки активности клиентов. Хммм, похоже правду, вечером надо будет попробовать, может не будет тормозить. Только, мне надо на стороне клиента для проверки активности "сервера". -Added Цитата wdk @ Вот тебе тупое решение: Сделай у клиента UDPServer, который будет слушать порт, а у сервера UDPClient, который будет слать сообщение "вот, я ожил"! Может и криво, но работать будет. Это надо будет оставить на крайняк. Но как workaround однозначно подойдет, спасибо. |
Сообщ.
#8
,
|
|
|
Сэйдж тут еще зависит от того какую функциональность ты хочешь получить....
Твой вопрос напоминает мне следующее: Ты хочешь каждый раз с клиента проверять не отправил ли сервер чего-то новенького ( предполагаю что для всех клиентов )... Если это так, то легче сформировать обратную функциональность. Со стороны сервера проверять подключился ли клиент, если да , то отсылать ему данные... |
Сообщ.
#9
,
|
|
|
Цитата FlyDead @ Сэйдж тут еще зависит от того какую функциональность ты хочешь получить.... Твой вопрос напоминает мне следующее: Ты хочешь каждый раз с клиента проверять не отправил ли сервер чего-то новенького ( предполагаю что для всех клиентов )... Если это так, то легче сформировать обратную функциональность. Со стороны сервера проверять подключился ли клиент, если да , то отсылать ему данные... Функциональность даже проще. Есть приложение (которое выступает и как клиент, и как сервер). Запускаем его на одном компьютере, запускаем на другом. Естественно они соединены по сети. Так вот, у обоих могут появится данные друг для друга, которые должны быть оперативно приняты. Для этого я постоянно проверяю TcpClent-ом NetworkStream (видимо криворукий способ, но другого я не знаю, первый раз заюзал сокеты и потоки в приложении). |
Сообщ.
#10
,
|
|
|
У TCPClient есть такой делегат "Terminated",
может всех подключившихся хранить в массиве типа объект в котором есть TcpClient, и номер ячейки в котором находиться объект. При возникновении вызова делегата ( т.е. при отключении клиента), заранее ты ему привязываешь метод из вышеуказанного объекта, и тот просто сам себя удаляет из массива соединений. Я сделал так у себя в мессенджере, всё работало нормально и достаточно удобно. |
Сообщ.
#11
,
|
|
|
Всем спасибо за помощь, вопрос решился, только оказывается дело в потоках было.
|