简单的异步HTTP服务端和客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/// <summary>
       /// 异步Http服务器
       /// </summary>
       class AsyncHttpServer
       {
           readonly HttpListener _listener;
           //相应信息
           const string RESPONSE_TEMPLATE = "<html><head><title>Test</title></head><body><h2>Test page</h2><h4>Today is: {0}</h4></body></html>";
 
           public AsyncHttpServer(int portNumber)
           {
               _listener = new HttpListener();
               _listener.Prefixes.Add(string.Format("http://+:{0}/", portNumber));
           }
 
           public async Task Start()
           {
               _listener.Start();
 
               while (true)
               {
                   var ctx = await _listener.GetContextAsync();
                   Console.WriteLine("Client connected...");
                   var response = string.Format(RESPONSE_TEMPLATE, DateTime.Now);
 
                   using (var sw = new StreamWriter(ctx.Response.OutputStream))
                   {
                       await sw.WriteAsync(response);
                       await sw.FlushAsync();
                   }
               }
           }
 
           public async Task Stop()
           {
               _listener.Abort();
           }
       }

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// <summary>
 /// 客户端获取响应信息
 /// </summary>
 /// <param name="url"></param>
 /// <returns></returns>
 static async Task GetResponseAsync(string url)
 {
     using (var client = new HttpClient())
     {
         HttpResponseMessage responseMessage = await client.GetAsync(url);
         string responseHeaders = responseMessage.Headers.ToString();
         string response = await responseMessage.Content.ReadAsStringAsync();
 
         Console.WriteLine("Response headers:");
         Console.WriteLine(responseHeaders);
         Console.WriteLine("Response body:");
         Console.WriteLine(response);
     }
 }

注: 以管理员身份运行程序

posted @   zzhi.wang  阅读(2055)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示