繁体   English   中英

Web服务器:从流中读取http请求

[英]Web server: reading http request from stream

问候!

我一直在鬼混C#(现在),现在我坚持使用简单的HTTP Web服务器实现。 老实说,我不想与HTTP规范相处-我只需要编写一个很小的 (读作简单的 )HTTP Web服务器。 而且我鼓励了这个问题:客户端将请求发送到服务器,然后服务器解析它,运行一些操作,建立响应并将其发送回客户端。 这似乎是显而易见的(至少对我而言)。

这是到目前为止我得到的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(IPAddress.Any, 80);
            listener.Start();

            Socket sock = listener.AcceptSocket();

            try
            {
                Stream s = new NetworkStream(sock);
                s.ReadTimeout = 300;

                StreamReader reader = new StreamReader(s);
                StreamWriter writer = new StreamWriter(s);
                writer.AutoFlush = true;

                Console.WriteLine("Client stream read:\r\n");

                string str = "none";

                while (sock.Connected && !reader.EndOfStream && str.Length > 0) // here's where i'm stuck
                {
                    str = reader.ReadLine();
                    Console.WriteLine("{0} ({1})", str, str.Length);
                }

                Console.WriteLine("Sending response...\r\n");

                {
                    string response = "<h1>404: Page Not Found</h1>";
                    writer.WriteLine("HTTP / 1.1 404 Not Found");
                    writer.WriteLine("Content-Type: text/html; charset=utf-8");
                    writer.WriteLine("Content-Length: {0}", response.Length);
                    writer.WriteLine("\r\n{0}", response);
                }

                Console.WriteLine("Client: over\r\n");

                s.Close();
                sock.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception: {0}\r\nTrace: \r\n{1}", e.Message, e.StackTrace);
            }

            Console.ReadKey();
        }
    }
}

但是我遇到了一个“难题”:我正在通过输入流读取请求,因此当客户端关闭浏览器中的页面时,输入数据流将终止(让我们谈谈最明显的动作,不包括curl,w3和其他“怪胎的东西“)。

因此,问题是:如何确定请求的结束? 例如,我什么时候应该停止读取请求数据并开始发送响应?

为什么不使用HttpListener? 您可以使用5行代码来构建一个简单的HTTP服务器。

这篇Wikipedia文章非常简洁地说明了请求消息格式。

请求行和标头必须全部以<CR> <LF>结尾(即,回车后跟换行符)。 空行只能由<CR> <LF>组成,不能包含其他空格。 在HTTP / 1.1协议中,除Host以外的所有标头都是可选的。

基本上,请注意标题和/或潜在邮件正文之后的空白行。

根据HTTP规范 ,可以使用某些标头来确定是否存在消息正文:

通过在请求的消息头中包含Content-Length或Transfer-Encoding头字段,可以指示请求中消息主体的存在。

另一个选择是: http : //webserver.codeplex.com/即使您不想使用它,也可以窃取想法,因为它实现了完整的请求生命周期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM