Действительно странное клиентское использование HTTP TcpClient в C#

Я тип M-x delete-region довольно часто, но можно связать его он с ключом.

С Удаляют Режим выбора в более новых версиях Emacs, Вы не должны вводить команду, только начните вводить:

По умолчанию, вставка текста обычно происходит, даже если метка является active—, например, вводя вставки символ вЂ˜a’, то деактивирует метку. Удалите Режим выбора, незначительный режим, изменяет это поведение: если Вы включаете тот режим, то вставка пишет сообщение, в то время как метка является активными причинами текст в регионе, который будет удален сначала. Кроме того, управляет, чтобы обычно удалили всего один символ, такой как C-d или DEL , удалит весь регион вместо этого. Для переключения Удаляют Режим выбора на или прочь, тип M-x delete-selection-mode.

8
задан Community 23 May 2017 в 12:33
поделиться

3 ответа

Попробуйте использовать System.Net.WebClient напрямую вместо System.Net.Sockets.TcpClient:

using System;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            WebClient wc = new WebClient();
            Console.WriteLine("[requesting...]");
            Console.WriteLine(wc.DownloadString("http://www.google.com"));
            Console.WriteLine("[done!]");
            Console.ReadKey();
        }
    }
}
-2
ответ дан 6 December 2019 в 00:58
поделиться

Во всем этом я нашел один вопрос:

Как я могу прочитать ответ и быть уверенным, что прочитал весь ответ в HTTP/1.1 запросе?

И это вопрос, на который я могу ответить!

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

Чтобы реализовать соединение TcpClient наиболее надежно, вы должны использовать все асинхронные методы и обратные вызовы. Соответствующие методы следующие:

1) Создайте соединение с помощью TcpClient.BeginConnect(...) с обратным вызовом TcpClient.EndConnect(...)
. 2) Отправьте запрос с помощью TcpClient.GetStream().BeginWrite(...) с обратным вызовом TcpClient.GetStream().EndWrite(...)
3) Получение ответа с помощью TcpClient.GetStream().BeginRead(...) с обратным вызовом TcpClient.GetStream().EndRead(...), добавление результата в буфер StringBuilder, а затем повторный вызов TcpClient.GetStream().BeginRead(...) (с тем же обратным вызовом) до получения ответа размером 0 байт.

Именно этот последний шаг (многократный вызов BeginRead до тех пор, пока не будет прочитано 0 байт) решает проблему получения ответа, всего ответа и ничего, кроме ответа. Так что помогите нам с TCP.

Надеюсь, это поможет!

2
ответ дан 6 December 2019 в 00:58
поделиться

Я предлагаю вам попробовать свой код на стандартном, хорошо протестированном и широко распространенном веб-сервере, установленном на вашем собственном локальном компьютере, таком как Apache HTTPD или IIS.

Настройте свой веб-сервер для ответа без заголовка Host (например, веб-приложение по умолчанию в IIS) и посмотрите, все ли в порядке.

В итоге вы не можете точно сказать, что происходит за кулисами, поскольку вы не контролируете веб-сайты / веб-приложения, такие как google, yahoo и т. Д.
Например, администратор веб-сайта может настроить сайт так, чтобы не было приложения по умолчанию для входящих TCP-подключений на порт 80 с использованием протокола HTTP.
Но он / она может захотеть настроить telnet-приложение по умолчанию при подключении через TCP-порт 23 с использованием протокола TELNET.

0
ответ дан 6 December 2019 в 00:58
поделиться
Другие вопросы по тегам:

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