Прослушиватель Asynch / TCP - работает в нескольких потоках - PullRequest
0 голосов
/ 07 ноября 2018

Я довольно плохо знаком с сетевыми / сокетными подключениями. После прочтения множества статей и вопросов stackoverflow. я придумал другой подход и решил, что буду использовать приведенный ниже код высокого уровня для моего прослушивателя TCP Asynch

public class DeviceListener
{
    private TcpListener listener = null;

    public DeviceListener(Ip,PortNo)
    {
        listener = new TcpListener(Ip,PortNo);
    }

    public void StartListener()
    {
        listener.Start();
        //TODO: Log listening started here
        WaitForClients();
    }

    private void WaitForClients()
    {
        listener.BeginAcceptTcpClient(OnClientConnected, null);
    }

    private void OnClientConnected(IAsyncResult asyncResult)
    {
        WaitForClients();
        TcpClient client = listener.EndAcceptTcpClient(asyncResult);

        if(client != null)
        {
            //TODO: Log connected
            HandleClientRequest(client);
        }
    }

    private void HandleClientRequest(TcpClient client)
    {
        //Code to process client request
        //Dispose Client
    }
}

Согласно моему требованию мне нужно 2-3 слушателя. Поэтому я создаю новый экземпляр слушателей, использующих тот же IP-адрес и другой порт, которые будут входами для вышеуказанного метода. (Допустим, я использую Ip xxx.xx.xx.xx в порте 5000 и xxx.xx .xx.xx в порту 5001 )

Мой сторонний клиент (1-й клиент, прослушивающий порт 5000 и 2-й клиент, прослушивающий порт 5001), который настроен в той же сети, действует как клиент, и они отправляют сообщения KeepAlive каждую секунду , и у них есть время ожидания 500 мс

HanleClientRequestMethod высокий уровень

            byte[] buffer = new byte[1024];
                    string data = null;
                    using (NetworkStream stream = client.GetStream())
                    {


                  int bytesRead;
                            // Loop to receive all the data sent by the client.
                            while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                // Translate data bytes to a ASCII string.
                                data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        if ()//check length
                                {
                                    byte[] byteData = Encoding.ASCII.GetBytes(data);
                                    stream.WriteAsync(byteData, 0, byteData.Length);
                                }
//other logic to receive data fast enough and happend in same millisecond
              }
    }client.Close();

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

Из моих логов я заметил

  • Если два сообщения синхронизации получены в одну и ту же миллисекунду (работает в асинхронном режиме) и подтверждены также в течение одной и той же миллисекунды. Время ожидания клиента, но согласно моим журналам я вижу, как оба потока получены и подтверждены в одну и ту же миллисекунду

    • В некоторых случаях я заметил, что 1-й клиентский запрос получен, 2-й клиентский запрос получен, а второй ответ отправлен, а затем отправляется первый ответ, что означает, что отправка приложения сохраняет сообщения в порядке, поскольку они асинхронны.

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

Пожалуйста, поделитесь своими мыслями

...