Разработка клиента TCP под .net 4 с функциями синхронизации и асинхронности, которые также прослушивают уведомления, инициируемые сервером - PullRequest
2 голосов
/ 15 марта 2012

Я разработал TCP-сервер по асинхронному шаблону под .net4 в c #, который одновременно обрабатывает сотни TCP-соединений. Он работал без проблем в течение нескольких месяцев, поэтому у меня есть опыт работы с асинхронными сокетами & co. в .net.

Теперь у меня есть еще один проект: на этот раз мне нужно разработать TCP-клиент, который подключается к серверу (один-единственный сервер, не более!) Через TCP и отправляет ему команды, получает ответы, а также обрабатывает входящий сервер. инициированные уведомления.

Теперь я немного растерялся. Я ищу наиболее эффективный способ реализации этих функций:

  • он должен отправлять некоторые команды асинхронно и получать их ответ также асинхронно
  • некоторые команды должны отправляться синхронно и получать ответ также синхронно
  • он должен прослушивать входящие уведомления TCP-сообщения. Таким образом, эти сообщения инициируются со стороны сервера, они не приходят как ответ на запрос

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

Спасибо!

Запросить образец:

02/00059/O/60/07656765/2/1/1/50617373776F7264//0100//////61 

Пример ответа:

00/00019/R/60/A//6D 

Образец уведомления: 00/00114/O/52/0011456046589/01123404543////////////0000/568112131424////3//43424‌1///0//////56312389921/020100///C3

1 Ответ

2 голосов
/ 15 марта 2012

Это действительно зависит от того, как сервер форматирует поступающие команды. Скажем, например, что они имеют форму "".

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

Затем я реализовал бы класс, который имеет этот текстовый сокет в качестве члена, и подписался бы на событие полученной строки.Этот класс также будет иметь словарь делегатов, который сопоставляется с возможными командами, которые могут быть получены с сервера, например:

public class MyClient
{
    private delegate void CommandHandler(string data);
    private TextSocket socket_ = new TextSocket(); // text socket we created

    private Dictionary<string, CommandHandler> cmdMap_ = new Dictionary<string, CommandHandler>();

    public MyClient()
    {
        // Initialise our map full of delegates
        cmdMap_["CMD1"] = (data) => { /* handle this command */ };
        cmdMap_["CMD2"] = (data) => { /* handler for this one */ };

        socket_.OnLineReceived += (line) 
        {
            if(!string.IsNullOrEmpty(line)) // sanity check
            {
                string cmd;
                string data;
                int pos = line.IndexOf(' ');
                if(pos != -1)
                {
                    cmd = line.Substring(0, pos);
                    data = line.Substring(pos + 1);
                }
                else
                    cmd = line;

                if(cmdMap_.ContainsKey(cmd))
                    cmdMap_[cmd](data);
            }
        }; 
    }
}

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

...