基于C#实现一个最简单的HTTP服务器实例

基于C#实现一个最简单的HTTP服务器实例

介绍

HTTP服务器通常用于向客户端提供Web应用程序或网站的内容。本教程将演示如何使用C#构建一个最简单的HTTP服务器实例。

步骤

第一步:创建一个新的C#控制台应用程序

首先,打开Visual Studio并创建一个新的C#控制台应用程序。

第二步:创建HTTPServer类

我们需要创建一个名为HTTPServer的类,该类将托管HTTP连接并接收客户端请求。

class HTTPServer
{
    private readonly HttpListener listener;

    public HTTPServer(params string[] prefixes)
    {
        listener = new HttpListener();

        foreach (string prefix in prefixes)
            listener.Prefixes.Add(prefix);
    }

    public void Start()
    {
        listener.Start();

        while (true)
        {
            HttpListenerContext context = listener.GetContext();

            Process(context);
        }
    }

    public void Stop()
    {
        listener.Stop();
    }

    private void Process(HttpListenerContext context)
    {
        string responseString = "<html><body><h1>Hello, World</h1></body></html>";
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);

        context.Response.ContentLength64 = buffer.Length;
        context.Response.OutputStream.Write(buffer, 0, buffer.Length);

        context.Response.Close();
    }
}

第三步:使用HTTPServer类

创建一个新的控制台应用程序,使用以下代码启动HTTPServer实例。

static void Main(string[] args)
{
    HTTPServer server = new HTTPServer("http://localhost:8080/");
    server.Start();
}

第四步:测试HTTP服务器

使用你喜欢的Web浏览器或Postman等HTTP客户端向http://localhost:8080/发送请求,你应该会看到浏览器显示“Hello, World”。

GET / HTTP/1.1
Host: localhost:8080

示例

示例1:向客户端发送HTML文件

以下示例演示如何用StreamReader打开HTML文件,将HTML内容作为String发送回客户端。

private void Process(HttpListenerContext context)
{
    string filename = context.Request.Url.AbsolutePath;
    filename = filename.Substring(1);
    if (string.IsNullOrEmpty(filename))
        filename = "index.html";

    string path = Path.Combine(Environment.CurrentDirectory, "public", filename);
    if (!File.Exists(path))
    {
        context.Response.StatusCode = 404;
        context.Response.Close();
        return;
    }

    string content = File.ReadAllText(path);
    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(content);

    context.Response.ContentLength64 = buffer.Length;
    context.Response.ContentType = "text/html";
    context.Response.OutputStream.Write(buffer, 0, buffer.Length);

    context.Response.Close();
}

示例2:将请求作为JSON响应输出

以下示例演示如何使用Newtonsoft.Json将请求对象转换为JSON字符串,并作为响应内容返回给客户端。

using Newtonsoft.Json;

class HTTPServer
{
    private readonly HttpListener listener;

    public HTTPServer(params string[] prefixes)
    {
        listener = new HttpListener();

        foreach (string prefix in prefixes)
            listener.Prefixes.Add(prefix);
    }

    public void Start()
    {
        listener.Start();

        while (true)
        {
            HttpListenerContext context = listener.GetContext();

            Process(context);
        }
    }

    public void Stop()
    {
        listener.Stop();
    }

    private void Process(HttpListenerContext context)
    {
        string json = JsonConvert.SerializeObject(context.Request);
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(json);

        context.Response.ContentLength64 = buffer.Length;
        context.Response.ContentType = "application/json";
        context.Response.OutputStream.Write(buffer, 0, buffer.Length);

        context.Response.Close();
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于C#实现一个最简单的HTTP服务器实例 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#使用Thrift作为RPC框架入门详细教程

    C#使用Thrift作为RPC框架入门详细教程 什么是Thrift Thrift是一个由Facebook开源的高效、多语言支持的远程过程调用(RPC)框架,可用于构建跨平台、可扩展的服务。 安装Thrift 在使用Thrift之前,先需要安装Thrift的编译器(thrift.exe),可以从Thrift官网(https://thrift.apache.or…

    C# 2023年6月1日
    00
  • C#中数组、ArrayList、List、Dictionary的用法与区别浅析(存取数据)

    下面是关于C#中数组、ArrayList、List、Dictionary的用法与区别浅析(存取数据)的完整攻略。 数组 定义 数组是一种数据结构,可以在单个变量下存储多个值。在C#中,数组是由相同类型的元素组成的集合。可以使用数组来存储一个固定数量的元素,这些元素在创建数组时就已被确定。 用法 创建数组 在C#中创建数组,需要指定数组的长度,然后使用关键字n…

    C# 2023年5月31日
    00
  • C#类中方法的执行顺序是什么

    C#中类的方法执行顺序是按照继承层次关系和调用顺序决定的,具体执行顺序如下: 静态构造函数 非静态构造函数 静态方法 非静态方法 其中,静态成员在程序启动时就已经存在,因此静态构造函数是在其他方法之前第一个运行的。而非静态成员只有在实例化对象后才会存在,因此非静态构造函数是在静态构造函数之后但在其他方法之前运行的。 下面是两个简单的例子,说明类中方法的执行顺…

    C# 2023年6月1日
    00
  • .NET/C#如何判断某个类是否是泛型类型或泛型接口的子类型详解

    要判断一个类是否为泛型类型或泛型接口的子类型,可以使用反射来实现。在使用反射之前,需要了解一些相关概念。 什么是泛型类型?泛型类型是可以接受一个或多个类型参数的类型。例如,List、Dictionary 都是泛型类型。 什么是泛型接口?泛型接口是一个带有一个或多个类型参数的接口。例如,IEnumerable、IList 都是泛型接口。 以下是使用C#代码来判…

    C# 2023年6月6日
    00
  • C#实现将浮点数表示的货币数量以汉字大写形式输出的方法

    实现将浮点数表示的货币数量以汉字大写形式输出,需要以下步骤: 步骤一:将浮点数转为字符串并分离整数部分和小数部分 我们可以使用C#的ToString方法将对应的浮点数转为字符串,并且使用Split方法将整数部分和小数部分分离开。 double money = 123456.78; string moneyStr = money.ToString("…

    C# 2023年6月7日
    00
  • C#构造函数在基类和父类中的执行顺序

    C#中的构造函数是用来初始化类中的成员变量的特殊方法。在类继承中,派生类会继承基类的构造函数,同时也可以自定义自己的构造函数。 构造函数在派生类的实例化过程中,会按照一定的规则执行基类和派生类中的构造函数,其执行顺序如下: 先执行基类的构造函数。 继续执行派生类的构造函数。 这个顺序是由 C# 引入的可靠构造函数(Reliable Constructor)原…

    C# 2023年6月7日
    00
  • 使用java实现“钉钉微应用免登进入某H5系统首页“功能”

    下面是使用Java实现“钉钉微应用免登进入某H5系统首页”功能的完整攻略。 确定应用类型 首先,需要确定钉钉上申请的应用类型,是H5微应用还是自建应用,这将决定后续开发的方式和技术选型。 获取AccessToken 获取AccessToken是访问钉钉开放平台的前提,我们可以通过开放平台提供的免费工具“开发助手”来获取AccessToken。 获取当前用户信…

    C# 2023年6月6日
    00
  • 浅谈JsonObject中的key-value数据解析排序问题

    浅谈JsonObject中的key-value数据解析排序问题——攻略 问题描述 在使用JsonObject进行key-value数据解析时,有时我们会发现得到的数据不是按照期望的顺序排列的。这个问题会给我们的主观体验带来很大不便,并且也可能对我们的后续工作造成困扰。所以在这篇文章中,我们将会讨论这个问题的产生原因以及解决方案。 问题产生的原因 当我们使用J…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部