基于TcpListerer的web服务器 和 基于HttpListerer的web服务器

摘自《Asp.Net 本质论》作者:郝冠军

/*
为了简化基于TCP协议的监听程序,.NET在System.Net.Sockets命名空间中提供了TcpListerer类,使用它,在构造函数中传递一组网络端点信息就可以准备好监听参数,而不再需要设置使用的网络协议等细节,调用Start方法之后,监听工作开始。AcceptTcpClient方法将阻塞进程,知道一个客户端的连接到达监听器,这个方法将返回一个代表客户端连接的代理对象
*/


 1 class TcpListener_Study
2 {
3 public void CreateTcpLister()
4 {
5 //获得本机的loopback网络地址,即127.0.0.1
6 IPAddress address = IPAddress.Loopback;
7 //创建可以访问的端点,8974 为0表示一个空闲的端口号
8 IPEndPoint endpoint = new IPEndPoint(address, 8974);
9
10 TcpListener newserver = new TcpListener(endpoint);
11 newserver.Start();
12 Console.WriteLine("开始监听,端口号:{0}", endpoint.Port);
13 while (true)
14 {
15 //等待客户端连接
16 TcpClient newclient = newserver.AcceptTcpClient();
17 Console.WriteLine("已建立连接");
18 //得到一个网络流
19 NetworkStream ns = newclient.GetStream();
20
21 //准被读取客户端请求的数据,读取的数据放在一个数组中
22 byte[] request = new byte[4096];
23
24 int lentth = ns.Read(request, 0, 4096);
25
26 string requeststring = Encoding.UTF8.GetString(request, 0, lentth);
27
28 Console.WriteLine(requeststring);
29
30 //回应状态行
31 string statusLine = "Http/1.1 200 ok \r\n";
32 byte[] statusLineBytes = Encoding.UTF8.GetBytes(statusLine);
33 //准备发送到客户端的网页
34 string responseBody = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head runat=\"server\"> <title>Socket Study </title></head><body><form id=\"form1\" runat=\"server\"><div>Hello World ,Socket Study </div> </form></body></html>";
35 byte[] responseBytes = Encoding.UTF8.GetBytes(responseBody);
36 string responseHeader = string.Format("Content-type:text/html; charset=UTF-8 \r\nContent-length:{0}\r\n", responseBody.Length);
37 byte[] responseHeaderBytes = Encoding.UTF8.GetBytes(responseHeader);
38 //向客户端发送状态信息
39 ns.Write(statusLineBytes, 0, statusLineBytes.Length);
40 //发送回应头
41 ns.Write(responseHeaderBytes, 0, statusLineBytes.Length);
42
43
44 ns.Write(new byte[] { 13, 10 },0,2);
45 //发送内容
46 ns.Write(responseBytes, 0, statusLineBytes.Length);
47 newclient.Close();
48 if (Console.KeyAvailable)
49 {
50 break;
51 }
52 newserver.Stop();
53 }
54 }
55 }


/*
为了进一步简化http协议的监听器,.Net在命名空间System.Net中提供了HttpListener类,伴随这个对象,.NET提供了一系列相关 *
对象封装了HTTP的处理工作。 * */

 1 class HttpLisener_Study
2 {
3 public void CreateHTTPLister()
4 {
5 if (!HttpListener.IsSupported)
6 {
7 throw new System.InvalidOperationException("系统必须为xp sp2 server03 以上版本");
8 }
9 string[] prefixes = new string[] { "http://localhost:8974/" };
10
11 HttpListener listener = new HttpListener();
12 foreach (string s in prefixes)
13 {
14
15 listener.Prefixes.Add(s);
16 }
17 listener.Start();
18 Console.WriteLine("监听中");
19 while (true)
20 {
21 //阻塞线程,直到请求到达
22 HttpListenerContext context = listener.GetContext();
23 Console.WriteLine("已建立连接");
24
25 HttpListenerRequest request = context.Request;
26 Console.WriteLine("{0}{1} http/1.1", request.HttpMethod, request.RawUrl);
27 Console.WriteLine("Accept:{0}", string.Join(",", request.AcceptTypes));
28 Console.WriteLine("Accept-language:{0}",string.Join(",",request.UserLanguages));
29
30 Console.WriteLine("User-Agent:{0}", string.Join(",", request.UserAgent));
31
32 Console.WriteLine("Accept-Encoding:{0}", string.Join(",", request.Headers["Accept-Encoding"]));
33
34 Console.WriteLine("Connection:{0}", request.KeepAlive ? "Keep-Alive" : "close");
35
36 Console.WriteLine("Host:{0}", request.UserHostName);
37 Console.WriteLine("Pragma:{0}", request.Headers["Pragma"]);
38
39 //取得回应对象
40 HttpListenerResponse response = context.Response;
41 string responseString = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head runat=\"server\"> <title>Socket Study </title></head><body><form id=\"form1\" runat=\"server\"><div>Hello World ,Socket Study </div> </form></body></html>";
42 response.ContentLength64 = Encoding.UTF8.GetByteCount(responseString);
43 response.ContentType = "text/html;charset=UTF-8";
44 //输出回应内容
45 System.IO.Stream output = response.OutputStream;
46 System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
47 writer.Write(responseString);
48 writer.Close();
49 if (Console.KeyAvailable)
50 {
51 break;
52 }
53
54 listener.Stop();
55 }
56 }
57 }

基于TcpListerer的web服务器 和 基于HttpListerer的web服务器,码迷,mamicode.com

时间: 2025-01-15 23:34:07

基于TcpListerer的web服务器 和 基于HttpListerer的web服务器的相关文章

基于tomcat响应处理模型实现的高并发web服务器

在上一篇博客中,一个简单的AIOweb处理例子,可以看到AIO异步处理,依赖操作系统完成IO操作的Proactor处理模型确实很强大,可以是实现高并发,高响应服务器的不错选择,但是在tomcat中的connector的处理模型还依旧是基于NIO的处理,当然,我认为这可能会在以后的版本进行改进,但另一方面,我更认为AIO的负载控制方面的处理可能是比较难的,因为AIO api并没有提供我们对分配线程组的处理,而只是提供一个线程组,交给操作系统去解决io处理上的问题,所以,这可能会给需要复杂处理的负载

Flask之旅《Flask Web开发:基于Python的Web应用开发实战》学习笔记

<Flask Web开发:基于Python的Web应用开发实战> 点击上方的"目录"快速到达哦! 虽然简单的网站(Flask+Python+SAE)已经上线,但只是入门.开发大型网站,系统地学习一遍还是有必要的. 1 虚拟环境 2016-6-8 书上介绍了 virtualenv,每个venv都会拷贝一份packages到项目 /venv目录. virtualenv venv venv\Scripts\activate.bat (venv) $ pip freeze >

《Flask Web开发:基于Python的Web应用开发实战》pdf 免费下载

<Flask Web开发:基于Python的Web应用开发实战>pdf 免费下载链接: https://u253469.ctfile.com/fs/253469-292665036 第一部分 Flask 简介第1 章 安装 .........................................................................................................................................

《Flask Web开发:基于Python的Web应用开发实战》pdf 完整版免费下载

<Flask Web开发:基于Python的Web应用开发实战>.pdf pdf 完整版免费下载: https://u253469.ctfile.com/fs/253469-292665036 更多电子书下载: http://hadoopall.com/book 内容简介 本书不仅适合初级Web开发人员学习阅读,更是Python程序员用来学习高级Web开发技术的优秀参考书. ? 学习Flask应用的基本结构,编写示例应用: ? 使用必备的组件,包括模板.数据库.Web表单和电子邮件支持: ?

Flask Web开发:基于Python的Web应用开发实战PDF

Flask Web开发:基于Python的Web应用开发实战PDF 百度网盘 链接:https://pan.baidu.com/s/1_Ax_ubMUOwwfoNPUn2mDeQ 提取码:s39f 复制这段内容后打开百度网盘手机App,操作更方便哦 内容简介  · · · · · · 本书不仅适合初级Web开发人员学习阅读,更是Python程序员用来学习高级Web开发技术的优秀参考书. ? 学习Flask应用的基本结构,编写示例应用: ? 使用必备的组件,包括模板.数据库.Web表单和电子邮件支

基于Linux搭建apache服务后,怎么构建web虚拟主机?

虚拟web主机指的是在同一台服务器中运行多个web站点,其中的每个站点实际上并不独立占用整个服务器,因此被称为"虚拟"web主机,通过虚拟web主机服务可以充分利用服务器的硬件资源. 使用httpd可以非常方便的去搭建虚拟主机服务器,只需要运行一个httpd服务就能够同时支撑大量的web站点.httpd支持的虚拟主机类型有这么三种(与Windows 的IIS服务一样): 1.相同IP.端口号.不同域名的虚拟主机: 2.相同IP.不同端口号的虚拟主机: 3.不同IP.相同端口号的虚拟主机

CentOS7构建虚拟Web主机(基于域名、端口、IP地址)

虚拟Web主机 在同一台物理服务器中运行多个Web站点,其中每一一个站点并不独立占用一台真正的计算机. httpd支持的虚拟主机类型 基于域名的虚拟主机 基于IP地址的虚拟主机 基于端口的虚拟主机 构建虚拟主机------基于域名 (1)安装bind.httpd服务. (2)进入named服务的主配置文件,将下图两个位置改为"any". [[email protected] ~]# vim /etc/named.conf (3)进入named服务的区域配置文件,添加两个域名的区域信息.

Dynamics CRM 2015/2016 Web API:基于视图的数据查询

Dynamics CRM 2016 Web API支持基于视图来查询数据,博主初看到该Feature,着实让我眼前一亮,这个功能太给力了,完全颠覆了之前复杂繁琐的取数方式了,现在的视图真正到了定义一次,处处复用的地步了!使用方法也很简单,只需要加个参数并指定需要调用的View ID就好了.接下来我给大家演示3个比较常用的场景:调用公共视图,调用私有视图,调用SubGrid视图. 公共视图 什么是公共视图?就是大家都有权限访问的视图,比如客户实体上的我的可用客户视图,我们一般在UI上面这么调用它们

项目构建之maven篇:8.maven发布web工程及基于spring mvc,jetty实现的用户管理demo

web工程目录结构 pom/pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&qu