Лучший способ реализовать слушатель сокета в C # - PullRequest
7 голосов
/ 15 ноября 2009

Я уже искал ответы, но не могу найти ничего похожего ...

Я довольно новичок в C #. Мне нужно создать программу на C # с использованием WinForms. В основном он состоит из 2 компонентов: пользовательского интерфейса, а затем мне нужен процесс, который постоянно прослушивает TCP-порт сокета. Если что-то получено, мне нужно вызвать событие или что-то подобное, чтобы я мог обновить пользовательский интерфейс.

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

И затем, когда я получаю сообщение, как я могу уведомить пользовательский интерфейс о необходимости его обновления?

Спасибо!

Ответы [ 4 ]

11 голосов
/ 15 ноября 2009

Вы можете использовать TcpListener, который ожидает входящих соединений в другом потоке. Каждый раз, когда вы получаете новое соединение, создайте новый поток для его обработки. Используйте Control.Invoke для обновления пользовательского интерфейса из не-пользовательского потока. Вот краткий пример:

public MainForm()
{
    InitializeComponents();
    StartListener();
}

private TcpListener _listener;
private Thread _listenerThread;

private void StartListener()
{
    _listenerThread = new Thread(RunListener);
    _listenerThread.Start();
}

private void RunListener()
{
    _listener = new TcpListener(IPAddress.Any, 8080);
    _listener.Start();
    while(true)
    {
        TcpClient client = _listener.AcceptTcpClient();
        this.Invoke(
            new Action(
                () =>
                {
                    textBoxLog.Text += string.Format("\nNew connection from {0}", client.Client.RemoteEndPoint);
                }
            ));;
        ThreadPool.QueueUserWorkItem(ProcessClient, client);
    }
}

private void ProcessClient(object state)
{
    TcpClient client = state as TcpClient;
    // Do something with client
    // ...
}
1 голос
/ 15 ноября 2009

При запуске вы можете создать (создать) новый поток, который прослушивает новые сообщения в бесконечном цикле. Как только сообщение получено, поток может обновить некоторый общий ресурс (установить флаг). Конечно, вы могли бы сделать это более изощренным, если бы использовали синхронизированную очередь для передачи сообщений. Или через WCF (хотя это кажется излишним для ваших целей).

1 голос
/ 15 ноября 2009

Возможно, это не лучший способ сделать это, но он должен работать ...

Вы можете запустить свой код прослушивателя TCP в новом потоке при запуске программы ... Таким образом, вы прослушиваете код TCP, пока пользовательский интерфейс отключен для выполнения других задач. Когда что-то происходит в потоке TCP, он должен сигнализировать потоку пользовательского интерфейса каким-либо событием или очередью событий.

Теперь, что касается обновления объекта WinForms при получении чего-либо, я полагаю, что только поток, создавший элемент управления WinForms, может обновлять элементы управления. Таким образом, вы должны принять это во внимание также.

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

1 голос
/ 15 ноября 2009

Вы можете использовать TcpListener class. В документации есть пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...