Параллельный вызов tcpclient stem.IO.IOException: невозможно прочитать данные из транспортного соединения: попытка подключения не удалась, так как подключено - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть один экземпляр класса, в котором я управляю входом в систему / пульсом и фактическим отправлением пакетов рабочих элементов, получающих по tcp-клиенту.

Проблема в том, что когда я пытаюсь вызвать ProcessCommand параллельно, иногда я получаю ошибку

System.IO.IOException: невозможно прочитать данные из транспортного соединения: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, так как подключенный хост не смог ответить,---> System.Net.Sockets.SocketException: попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через определенный промежуток времени, или не удалось установить соединение, так как подключенный хост не смог ответить

public class TcpCommunicationManager
{        
    private TcpClient client = null;
    public TcpCommunicationManager(string ip, int port)
    {
        Ip = ip;
        Port = port;
    }



    public SSMIResponse ProcessCommand(SSMIRequest request)
    {

        SSMIResponse response = new SSMIResponse();
        if (request.CmdType == CommandType.Login)
        {
            client = new TcpClient(Ip, Port);             
        }

        response.RequestedCommand = GetCommandTextFromRequest(request);
        byte[] buf = Encoding.ASCII.GetBytes(response.RequestedCommand);
        var stream = client.GetStream();
        request.RequestTime = DateTime.Now;

        var result = stream.WriteAsync(buf, 0, buf.Length);
        Console.WriteLine("Request Command:" + response.RequestedCommand);
        response.SendSuccess = true;

        var data = new Byte[1024];


            stream.ReadTimeout = 1000 * 5; //5 seconds


            // Read the first batch of the TcpServer response bytes.
            var bytes = stream.Read(data, 0, data.Length);
            response.ResponseTime = DateTime.Now;
            response.ResponseRawResultPacket = Encoding.ASCII.GetString(data, 0, bytes);
            ProcessResponseResult(request, response);
            Console.WriteLine("Response Received:" + response.ResponseRawResultPacket + Environment.NewLine);
        return response;
    }        
} 
...