Какой класс сетевого программирования я должен использовать для своей услуги Windows? - PullRequest
0 голосов
/ 11 марта 2020

У меня есть Windows служба, которая выполняет некоторые задачи. Мне нужно добавить некоторые сетевые функции в список задач.

Вот как будет выглядеть сетевой лог c:

+-------------------+                                                  +---------------+
|                   |                                    send request  |               |
|                   |                                   for some data  |               |
|                   |  <---------------------------------------------  |               |
|                   |                                                  |               |
|                   |  process request                                 |    Client     |
|  Windows Service  |                                                  |  Application  |
|                   |  send response                                   |               |
|                   |  --------------------------------------------->  |               |
|                   |                                                  |               |
|                   |                                process response  |               |
+-------------------+                                                  +---------------+

ПРИМЕЧАНИЕ: Там может быть несколькими клиентскими приложениями, запрашивающими данные одновременно.

ПРИМЕЧАНИЕ: Каждое клиентское приложение может отправлять несколько запросов данных одновременно.

ПРИМЕЧАНИЕ: The * Служба 1052 * и клиентское приложение могут находиться в одной и той же сети или в разных сетях.

Вот базовая c схема службы Windows:

class Processor : System.ServiceProcess.ServiceBase
{
    private System.Timers.Timer Timer1 = null;
    private System.Timers.Timer Timer2 = null;
    private System.Timers.Timer Timer3 = null;

    protected override void OnStart(string[] args)
    {
        Timer1 = new System.Timers.Timer();
        Timer1.Interval = ...;
        Timer1.AutoReset = true;
        Timer1.Elapsed += new ElapsedEventHandler(...);
        Timer1.Start();

        Timer2 = new System.Timers.Timer();
        Timer2.Interval = ...;
        Timer2.AutoReset = true;
        Timer2.Elapsed += new ElapsedEventHandler(...);
        Timer2.Start();

        Timer3 = new System.Timers.Timer();
        Timer3.Interval = ...;
        Timer3.AutoReset = true;
        Timer3.Elapsed += new ElapsedEventHandler(...);
        Timer3.Start();

        // I was thinking of creating a new Task (System.Threading.Tasks.Task) or Timer (System.Timers.Timer) here to handle the networking-related logic.
    }

    protected override void OnStop()
    {
        Timer1.Stop();
        Timer1.Close();

        Timer2.Stop();
        Timer2.Close();

        Timer3.Stop();
        Timer3.Close();
    }
}

Я был читая документацию Microsoft по сетевому программированию , но я до сих пор не знаю, какой класс лучше всего подойдет для моей ситуации.

Вот классы, о которых я думал:

Классы TcpListener и TcpClient являются оболочками класса Socket. Кажется, они скрывают многие детали реализации и облегчают понимание кода. Класс Socket кажется ошеломляющим по количеству предоставляемых функций, но он может обрабатывать нескольких клиентских подключений . Может ли TcpListener обрабатывать несколько клиентов или он может прослушивать только по одному за раз?

Какой класс сети подойдет для моей ситуации? Как я могу гарантировать, что запросы будут обрабатываться быстро, а также гарантировать, что задачи, не связанные с сетью, будут продолжаться без блокировки?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

ПРИМЕЧАНИЕ. Сервисное и клиентское приложение Windows может находиться в одной и той же сети или в разных сетях.

По крайней мере, здесь я могу дать вам полудекулярный ответ. Классы Networking не заботятся о том, находится ли другой конец на том же компьютере, тот же коммутатор или пробник Voyager 2. Если он работает против localhost, обычно это задача сетевых администраторов, чтобы убедиться, что путь существует.

Получение службы, доступной по сетям - особенно на inte rnet, к сожалению, входит в хостинг сервера. Это совершенно другая топика c от программирования. Необходимые изменения могут варьироваться от «ничего» до «полного изменения дизайна сервера», в зависимости от реалий среды. Но это должно быть больше на стороне «Ничего», поскольку задача администратора сервера - обеспечить доступность сервера.

0 голосов
/ 13 марта 2020

Я провел небольшое исследование и ошибся. Класс TcpListener может обрабатывать более одного ожидающего клиентского соединения за раз.

Поскольку сообщения должны оставаться довольно маленькими, связанные с HTTP классы кажутся излишними.

Поскольку мои требования относительно просты, и я предпочел бы придерживаться более простого проекта, я буду использовать классы TcpListener и TcpClient.

...