На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Проблемы с TcpClient
    Доброго времени суток всем обратившим внимание.

    Ситуация: постоянно нужно проверять сервер (прога на основе TcpListener) не отправил ли он чего нового через NetworkStream, сервер может быть запущен, а может и не запущен.

    Вот когда он не запущен, следующий код (выполняется каждые пол-секунды)
    ExpandedWrap disabled
      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/порту) я не допер. :wall:
    Буду очень признателен, если кто подскажет как можно выкрутиться.
      это получается что ты просто каждые пол секунды создаешь коннект к серверу и разрываешь его, смысл :blink: ?
      Если ты так часто общаешься со своим сервером, то уж создай коннект и просто постоянно слушай что скажет тебе твой сервер
        Pit-Bul читай вопросы...
        Цитата Pit-Bul @
        Но как, блин, по другому организовать постоянный опрос сервера

        под этим понимается проверка на доступность сервера?
          Socket.Select не поможет? Юзал его на стороне сервера для проверки активности клиентов.
            Цитата Pit-Bul @
            это получается что ты просто каждые пол секунды создаешь коннект к серверу и разрываешь его, смысл :blink: ?
            Если ты так часто общаешься со своим сервером, то уж создай коннект и просто постоянно слушай что скажет тебе твой сервер

            ОК, допустим запускаем клиент, сервер при этом не запущен, соответственно непрерывно читать данные никак. :( Нужно будет оперативно отловить момент, что сервер запустился и считать данные, а как ?

            Сервер у меня просто мое приложение, на основе TcpListener

            Добавлено
            Цитата FlyDead @
            под этим понимается проверка на доступность сервера?

            Очень корректный вопрос, сорри что сразу не пояснил. Под этим подразумевается, запущен ли мой "сервер" (просто прога на основе TcpListener) или нет. То есть проверять нужно по IP/порту. Или какой то другой способ есть ?
            Сообщение отредактировано: Сэйдж -
              Вот тебе тупое решение:
              Сделай у клиента UDPServer, который будет слушать порт, а у сервера UDPClient, который будет слать сообщение "вот, я ожил"! Может и криво, но работать будет.
                Цитата wdk @
                Socket.Select не поможет? Юзал его на стороне сервера для проверки активности клиентов.

                Хммм, похоже правду, вечером надо будет попробовать, может не будет тормозить.

                Только, мне надо на стороне клиента для проверки активности "сервера". :)

                -Added
                Цитата wdk @
                Вот тебе тупое решение:
                Сделай у клиента UDPServer, который будет слушать порт, а у сервера UDPClient, который будет слать сообщение "вот, я ожил"! Может и криво, но работать будет.

                Это надо будет оставить на крайняк. Но как workaround однозначно подойдет, спасибо.
                  Сэйдж тут еще зависит от того какую функциональность ты хочешь получить....
                  Твой вопрос напоминает мне следующее:
                  Ты хочешь каждый раз с клиента проверять не отправил ли сервер чего-то новенького ( предполагаю что для всех клиентов )...
                  Если это так, то легче сформировать обратную функциональность.
                  Со стороны сервера проверять подключился ли клиент, если да , то отсылать ему данные...
                    Цитата FlyDead @
                    Сэйдж тут еще зависит от того какую функциональность ты хочешь получить....
                    Твой вопрос напоминает мне следующее:
                    Ты хочешь каждый раз с клиента проверять не отправил ли сервер чего-то новенького ( предполагаю что для всех клиентов )...
                    Если это так, то легче сформировать обратную функциональность.
                    Со стороны сервера проверять подключился ли клиент, если да , то отсылать ему данные...

                    Функциональность даже проще. Есть приложение (которое выступает и как клиент, и как сервер). Запускаем его на одном компьютере, запускаем на другом. Естественно они соединены по сети. :) Так вот, у обоих могут появится данные друг для друга, которые должны быть оперативно приняты. Для этого я постоянно проверяю TcpClent-ом NetworkStream (видимо криворукий способ, но другого я не знаю, первый раз заюзал сокеты и потоки в приложении).
                      У TCPClient есть такой делегат "Terminated",
                      может всех подключившихся хранить в массиве типа объект в котором есть TcpClient, и номер ячейки в котором находиться объект.
                      При возникновении вызова делегата ( т.е. при отключении клиента), заранее ты ему привязываешь метод из вышеуказанного объекта, и тот просто сам себя удаляет
                      из массива соединений.

                      Я сделал так у себя в мессенджере, всё работало нормально и достаточно удобно.
                        Всем спасибо за помощь, вопрос решился, только оказывается дело в потоках было. :whistle:
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0497 ]   [ 17 queries used ]   [ Generated: 25.04.24, 17:42 GMT ]