我如何阅读客户请求?

时间:2018-06-13 13:18:06

标签: c# httplistener

我创建了一个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 :(得分:1)

您没有尝试正确调用服务。这是您的客户请求:

    GET / 192.168.1.26:8282 HTTP/1.0

您应该做的是首先通过端口8282建立到主机192.168.1.26的套接字连接。然后您必须以有效格式发出HTTP请求:

    GET / HTTP/1.0

请勿忘记在请求后添加一些换行符(即:\ r \ n \ r \ n)。然后您的Web服务器应该响应HTTP请求。

Telnet中的快速示例:

    telnet 192.168.1.26 8282
    GET / HTTP/1.0

netcat的快速示例:

    nc 192.168.1.26 8282
    GET / HTTP/1.0

请注意,这些简单示例仅用于帮助您确保Web服务可以正常访问和运行。理想情况下,您可能会使用更强大的HTTP客户端,该客户端可根据您的特定需求进行定制。这个过程仍然是一样的:

  1. 通过侦听端口建立与主机IP地址的连接
  2. 以有效格式发出HTTP请求:(HTTP_VERB PATH HTTP_VERSION)

    *)也许请查看所选浏览器中的开发人员工具(F12 - &gt;网络),了解如何发送HTTP标头。

  3. 以一种有意义的方式解析响应。

  4. “同样在我的代码中,每次请求发生时我都会设置一个消息框。” - 您应该尝试在消息框中输入手动消息,而不是从输入流中读取。这是一个很好的调试技术。在HTTP GET请求中,除了以可选查询字符串参数的形式外,您通常不会发送数据。我有一种感觉,你没有得到你期望的结果,因为你正在阅读那些不存在的输入。在从流输入读取之前,首先确保连接成功。