@oleg_ods

Как правильно получать данные из сокета(TcpClient)?

Добрый день!

Есть API которая через сокеты отдает JSON. Проблема в том, что при больших ответах TcpClient не всегда успевает принять все данные. Подскажите, пожалуйста, как решить данную проблему.

Принимаю таким образом. Thread.Sleep() частично решает проблему, но во-первых не всегда, а во-вторых сильно тормозит другие более легкие запросы.

using (var client = new TcpClient(_settings.Host, _settings.Port))
            {
                using (var ns = client.GetStream())
                {
                    using (var ms = new MemoryStream())
                    {
                        await ns.WriteAsync(requestData, 0, requestData.Length);                        

                        do
                        {
                            byte[] responseData = new byte[client.ReceiveBufferSize];
                            int recivedBytes = await ns.ReadAsync(responseData, 0, responseData.Length);
                            await ms.WriteAsync(responseData, 0, recivedBytes);
                            Thread.Sleep(400);
                        } while (client.Available > 0);

                        var response = ms.ToArray();

                        var result = Encoding.UTF8.GetString(response);

                        return ParseResponse(result);
                    }
                }
            }
  • Вопрос задан
  • 115 просмотров
Решения вопроса 1
@oleg_ods Автор вопроса
Решил проблему использованием StreamReader

using (var client = new TcpClient(_settings.Host, _settings.Port))
            {
                using (var ns = client.GetStream())
                {
                    using (var sr = new StreamReader(ns, Encoding.UTF8))
                    {
                        await ns.WriteAsync(requestData, 0, requestData.Length);

                        var result = await sr.ReadToEnd();

                        return ParseResponse(result);
                    }
                }
            }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы