Как я могу прочитать запрос клиента? - PullRequest
0 голосов
/ 13 июня 2018

Я создал httplistener.Поэтому мне нужно, когда клиент отправит мне данные, чтобы прочитать их.Проблема в том, что я не знаю, как клиент должен отправлять данные

HttpListener listener = new HttpListener();
        listener.Prefixes.Add("http://192.168.1.26:8282/");
        listener.Prefixes.Add("http://localhost:8282/");
        listener.Prefixes.Add("http://127.0.0.1:8282/");

        listener.Start();
        new Thread(() =>
        {
            Thread.CurrentThread.IsBackground = true;
            for (;;)
            {


                Console.WriteLine("Listening...");
                // Note: The GetContext method blocks while waiting for a request. 
                HttpListenerContext context = listener.GetContext();
                HttpListenerRequest request = context.Request;
                string text;
                using (var reader = new StreamReader(request.InputStream,
                                                     request.ContentEncoding))
                {
                    text = reader.ReadToEnd();
                    MessageBox.Show(text);
                }



                // Obtain a response object.
                HttpListenerResponse response = context.Response;
                // Construct a response.
                string responseString = "HelloWorld";
                byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
                // Get a response stream and write the response to it.
                response.ContentLength64 = buffer.Length;
                System.IO.Stream output = response.OutputStream;
                output.Write(buffer, 0, buffer.Length);
                // You must close the output stream.
                output.Close();

            }



        }).Start();

    }

Итак, с клиента я посылаю эту команду:

GET / 192.168.1.26:8282 HTTP/1.0

Но я получаю это сообщение

    Recv 34 bytes

SEND OK

+IPD,1,518:HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 13 Jun 2018 13:16:03 GMT
Connection: close
Content-Length: 339

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Header</h2>
<hr><p>HTTP Error 400. The request has an invalid header name.</p>
</BODY></HTML>
1,CLOSED

Я не могу понять, что не так.Также в моем коде я установил, чтобы получать окно сообщения каждый раз, когда запрос будет происходить.Но он никогда не запускается

Это то, что отправляет Mozilla enter image description here

1 Ответ

0 голосов
/ 13 июня 2018

Вы не пытаетесь вызвать службу правильно.Вот ваш клиентский запрос:

    GET / 192.168.1.26:8282 HTTP/1.0

Сначала вы должны установить сокет-соединение с хостом 192.168.1.26 через порт 8282. Затем вы должны выполнить HTTP-запрос в допустимом формате:

    GET / HTTP/1.0

Не забудьте добавить несколько новых строк после запроса (например: \ r \ n \ r \ n).Затем ваш веб-сервер должен ответить на запрос HTTP.

Быстрый пример в Telnet:

    telnet 192.168.1.26 8282
    GET / HTTP/1.0

Быстрый пример с netcat:

    nc 192.168.1.26 8282
    GET / HTTP/1.0

Обратите внимание, что эти быстрые примерыпредоставляются только для того, чтобы убедиться, что ваш веб-сервис доступен и работает правильно.В идеале вы, вероятно, будете использовать более надежный HTTP-клиент, настроенный под ваши конкретные потребности.Процесс все тот же:

  1. Установите соединение с IP-адресом вашего хоста через порт прослушивания
  2. Отправьте HTTP-запрос в допустимом формате: (HTTP_VERB PATH HTTP_VERSION)

    *) Возможно, проверьте инструменты разработчика в своем браузере (F12 -> Сеть), чтобы узнать, как отправляются и заголовки HTTP.

  3. Разборответ каким-то осмысленным образом.

«Также в своем коде я настроен на получение окна сообщения каждый раз, когда будет происходить запрос».- Вы должны попытаться вставить ручное сообщение в окно сообщения вместо чтения из входного потока.Это хорошая техника отладки.В запросе HTTP GET вы обычно не отправляете данные, кроме как в форме необязательных параметров строки запроса.У меня такое ощущение, что вы не получаете ожидаемых результатов, потому что вы читаете из входных данных, которых там нет.Перед чтением из потока ввода сначала убедитесь, что соединение установлено успешно.

...