Как обрабатывать асинхронное соединение tcpClient в цикле - PullRequest
0 голосов
/ 24 марта 2019

У меня есть несколько устройств, которые прослушивают один и тот же порт. Я просто отправляю разные сообщения, такие как A, B, C и получаю некоторые значения среды. Все устройства имеют разные IP-адреса. Я пытаюсь установить асинхронное соединение с устройством и синхронно отправлять сообщения на датчики.

для асинхронных операций, связанных с вводом-выводом, я в основном следую this ! и реализовано на основе того, что он написал. Вот что я реализовал.

 static async Task CallingMethodAsync()
    {
        List<string> devices = new List<string>
        {
            "10.20.30.116",
            "127.0.0.1",
            "10.20.30.149",
            "10.20.30.100"
        };

        List<string> messages = new List<string>
        {
            "A",
            "B",
            "C",
            "D",
        };
        List<Task> deviceList = new List<Task>();

        foreach (var device in devices)
        {

            foreach (var message in messages )
            {
                deviceList.Add(ConnectAsClientAsync(device, message));
            }
        }
        await Task.WhenAll(deviceList);
    }


static  Task ConnectAsClientAsync(string device,string  message)
    {
            return  new Task(  () =>
            {

                byte[] ClientRequestBytes = Encoding.UTF8.GetBytes(message);

                    try
                    {
                        using (var tcpClient = new TcpClient(device, 11000))
                        {

                            Console.WriteLine("Connected ->>" + device + " from port:" + port);


                            using (var networkStream = tcpClient.GetStream())
                            {
                                networkStream.Write(ClientRequestBytes, 0, ClientRequestBytes.Length);
                                byte[] bytesToRead = new byte[tcpClient.ReceiveBufferSize];
                                int bytesRead = nwStream.Read(bytesToRead, 0, tcpClient.ReceiveBufferSize);
                                var response = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead);
                                   Console.WriteLine("response ->>" + response+ " from device:"+device);
                            }
                        }
                    }
                    catch (SocketException ex)
                    {
                        Console.WriteLine("No Answer!! from ->>" + device + " from port:" + port);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Not Connected ->>" + device + " from port:" + port);
                    }
            });
    } 

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

Любая помощь приветствуется.

...