多线程编程学习笔记——编写一个异步的HTTP服务…
2018-06-22 04:49:21来源:未知 阅读 ()
接上文 多线程编程学习笔记——使用异步IO
二、 编写一个异步的HTTP服务器和客户端
本节展示了如何编写一个简单的异步HTTP服务器。
1.程序代码如下。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace ThreadIODemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("--创建简单Web服务示例 -- ");
var server = new AsyncHttpServer(port: 1234);
var t = Task.Run(() => server.Start());
Console.WriteLine("Listening on port 1234.在浏览器中打开http://localhost:1234 ");
Console.WriteLine("测试连接");
Console.WriteLine();
GetResponseAsync("http://localhost:1234").GetAwaiter().GetResult();
Console.WriteLine();
Console.WriteLine("输入回车键,停止服务");
Console.ReadLine();
string msg= server.Stop().GetAwaiter().GetResult();
Console.WriteLine(msg);
Console.Read();
}
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);
}
}
}
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 port)
{
_listener = new HttpListener();
_listener.Prefixes.Add(string.Format("http://+:{0}/", port));
}
public async Task Start()
{
_listener.Start();
while (true)
{
var ctx = await _listener.GetContextAsync();
Console.WriteLine("{0} Client connected...",DateTime.Now.ToString());
string response = string.Format(RESPONSE_TEMPLATE, DateTime.Now);
using (var sw = new StreamWriter(ctx.Response.OutputStream))
{
await sw.WriteAsync(response);
await sw.FlushAsync();
}
}
//return string.Format("监听服务开始 {0} ", DateTime.Now.ToString());
}
public async Task<string> Stop()
{
_listener.Stop();
Console.WriteLine("监听停止,停止服务");
await Task.Delay(TimeSpan.FromSeconds(2));
return string.Format("监听服务停止 {0} ",DateTime.Now.ToString());
}
}
}
2.http服务启动如下图。
3.在浏览器中输入http://localhost:1234,之后如下图1。在等30秒之后,再次刷新,如下图中的2.
4.在http的web服务程序中可以看到浏览器访问了服务器两次。如下图中的红框。
4.在http的web服务程序中输入回车,则服务会停止 。如下图中的红框。
这里我们通过HTTPListener类实现了一个非常简单的WEB服务器。也使用了TCPLISTENER类进行TCP套接字I/O操作。我们配置了监听器接收任何主机到本地机器1234端口的连接。然后在单独的工作线程中启动这个监管器,从而在主线程中可以控制这个监听器。
当使用GetContextAsync方法时会发生异步I/O操作。可惜的是,其并不接收CancellationToken从而实现取消功能。所以如果想关闭这个服务器,只需要调用 _listenter.Abort方法,这将丢弃所有连接并关闭服务器。
为了对这个服务器执行一个异步请求,我们使用了统一命名空间下的System.Net.Http集合中的HttpClient类。我们使用Get.Async方法来发起一个异步的Http Get请求。还有其他的方法用于发起其他的HTTP请求,比如POST,DELETE,PUT。HttpClient还有很多其他的选项,比如使用不同的格式(比如XML和JSON)来序列化和反序列化对象,指定代理服务器地址,认证以及其他配置。
当运行这个程序时,可以看到这个服务器被启动起来。在服务器端代码中,我们使用GetContextAsync方法来接收新的客户端连接。当有新的客户端连接时这个方法就会返回。我们简单的输出一个包含当前日期和时间的非常基础的HTML作为响应。然后我们请求服务并打印响应头和内容。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 详解php中的implements 使用 2020-03-18
- PHPExcel如何读取Excel文件 2020-03-10
- PHP实现的折半查询算法示例 2020-02-17
- PHP多进程编程之僵尸进程问题的理解 2020-02-17
- php中常用的魔术方法 2020-02-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash