【问题标题】:How can i read client request?我如何阅读客户请求?
【发布时间】:2018-06-13 13:18:06
【问题描述】:

我已经创建了一个 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 发送的内容

【问题讨论】:

  • 您从客户端发送的命令无效。 HTTP 请求的第一行有 3 个字段,而不是 4 个。例如,en.wikipedia.org/wiki/…

标签: c# httplistener


【解决方案1】:

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

    GET / 192.168.1.26:8282 HTTP/1.0

您应该首先通过端口 8282 与主机 192.168.1.26 建立套接字连接。然后您必须以有效格式发出 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 请求中,您通常不发送数据,除非以可选查询字符串参数的形式。我有一种感觉,你没有得到你期望的结果,因为你正在阅读不存在的输入。在从流输入中读取之前,首先要确保连接成功。

【讨论】:

  • 先获取?如何像在浏览器中打开 url 一样运行命令
  • 在浏览器中,只需使用 IP 地址和端口来调用您的 Web 服务。例如:192.168.1.26:8282 HTTP 动词和路径实际上是由浏览器自动添加的(在后台)。
  • 由于你似乎更关心浏览器的交互,所以打开浏览器的开发者工具(一般是F12)。然后导航到网络部分。然后,在 URL 栏中输入您的 IP 地址和端口: 192.168.1.26:8282 。您应该看到浏览器如何在开发人员工具中实际格式化 HTTP 请求。某些浏览器(例如 Firefox)实际上允许您编辑 HTTP 动词(命令)、路径和其他标头。如果你想在浏览器中玩这个,我推荐 Firefox 和开发者工具。请记住,对于您的命令,浏览器会自动添加 GET / HTTP
  • 根据 Mozilla 我必须发送这个但它不起作用我得到同样的错误“GET\r\nhttp://192.168.1.26:8282/\r\n”
  • 再次,Web 浏览器为您添加了 GET 和 \r\n\r\n。您只需提供包含您的 IP 地址和端口的 URL。只有“192.168.1.26:8282”应该进入浏览器的 URL 字段。如果您检查网络流量,您将看到浏览器实际上是如何为您格式化 HTTP 请求的,而不会在 URL 字段中显示您。
猜你喜欢
  • 2019-07-19
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多