- 浏览: 145754 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
老八牛:
利用迭代器让异步操作更加“人性化”-山寨版的AsyncEnumerator -
老八牛:
为什么看不到代码?
利用迭代器让异步操作更加“人性化”-山寨版的AsyncEnumerator -
xi4nyu:
如果启动Application中的settings 的debu ...
玩蛇记-使用Tornado构建高性能Web之二-autoreload -
huacnlee:
"且在python下工作多日才发现原来在.NET下的 ...
玩蛇记-使用tornado构建高性能Web应用之一 -
jasongreen:
异步数据库操作,在web上有什么作用吗?
玩蛇记-使用tornado构建高性能Web应用之一
为了说明一下基础tcp开发库是如何扩展来处理上层协议的,我这里用一个简单到极点的Http Server来作为例子。这个例子会处理发到特定端口的所有http请求,并返回显示Hello world的网页。
由于是一个很简单的例子,所以我们并不需要解析完整的Http协议,当然我们是能够很快构建一个http处理器,毕竟这是一个基于文本行的协议,不过即使这样还是需要很大的篇幅,所以我们只需要处理其中一小部份。
首先我们来看看Http的request。http的请求是一串文本,由多个行组成,每行都是key value形式的,第一行表示了请求的方法和路径,由空格隔开,后面的是请求的头,由冒号隔开,不过其中的内容表示什么意思对我们来说没什么意义,我们在这里也不打算处理,我们把它们存在一个hash表里,等待更高级的处理器来处理。
所以首先我们先建立一个类,实现IProcessor接口:
class HttpProcessor : IProcessor { #region IProcessor 鎴愬憳 public void Init(IWorkingSocket Sock) { throw new NotImplementedException(); } public void NextProcessor(IProcessor NextProcessor) { throw new NotImplementedException(); } public void PushData(byte[] Data, int ReadCount) { throw new NotImplementedException(); } #endregion #region IDisposable 鎴愬憳 public void Dispose() { throw new NotImplementedException(); } #endregion }<!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com -->
根据前面的分析我们需要在其中用一个HashTable来存储http的请求头信息。
在每一次得到一行数据的时候就分析,是头一行还是header的行。然后将其插入hashtable,如果得到的是一个空行,那么就表明请求结束了,那么我们就将一段html发送回去。
class HttpProcessor : IProcessor { private Dictionary<string, string> httpHeader; public HttpProcessor() { httpHeader = new Dictionary<string, string>(); } public event Action<IWorkingSocket,Dictionary<string, string>> OnRequest; #region IProcessor 成员 private IWorkingSocket Conn; public void Init(IWorkingSocket Sock) { Conn = Sock; } public void NextProcessor(IProcessor NextProcessor) { //如果没有下级处理器就留空 } public void PushData(byte[] Data, int ReadCount) { string line = Encoding.ASCII.GetString(Data, 0, ReadCount); if (line.Equals("\r\n")) { if (OnRequest != null) { OnRequest(Conn, httpHeader); } } string[] temp = null; if (line.Split(':').Length>1) { temp = line.Split(':'); httpHeader.Add(temp[0], temp[1]); return; } if (line.Split(' ').Length > 1) { temp = line.Split(' '); httpHeader.Add(temp[0], temp[1]); return; } } #endregion #region IDisposable 回收资源 public void Dispose() { httpHeader.Clear(); Conn = null; } #endregion }<!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com -->
ok,这样子后我们在处理OnRequest事件的时候就能够接收到一个Dictionary对象,里面就是所有http的头信息,如果我们不关系其中的内容就可以直接在这个事件里返回数据了。
最后的结果:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using org.Alexander.EDAS; namespace EdasServer { class Program { static void Main(string[] args) { Acceptor acp = new Acceptor(8888); acp.OnError = (ex, str) => { //TO DO:To handle listenner's error }; acp.Accepted = (sock,id,buffersize) => { AsyncSocket sk = new AsyncSocket(sock, buffersize); sk.ID = id; sk.OnError += new Action<Exception, string>(sk_OnError); sk.Disconnected += new Action<long>(sk_Disconnected); TokenProcessor Proc = new TokenProcessor(0x0A); sk.Processor = Proc; HttpProcessor httpProc = new HttpProcessor(); httpProc.OnRequest += new Action<IWorkingSocket, Dictionary<string, string>>(httpProc_OnRequest); Proc.NextProcessor(httpProc); sk.WaitReceive(); }; acp.WaitAsyncAccept(); Console.ReadKey(); } static void httpProc_OnRequest(IWorkingSocket arg1, Dictionary<string, string> arg2) { StringBuilder html=new StringBuilder(); html.Append("<HTML><HEAD><TITLE>test</TITLE></HEAD><BODY><H3>Hello world</H3></BODY></HTML>"); StringBuilder str = new StringBuilder(); str.Append("HTTP /1.1 200 OK\r\n"); str.Append("Date:" + DateTime.Now.ToLongDateString()+"\r\n"); str.Append("Server: Edas Server(win32)\r\n"); str.Append("Content-Length: " + html.Length+"\r\n"); str.Append("Content-Type: text/html\r\n"); string Data = str.ToString() + "\r\n" + html.ToString(); arg1.SendToQueue(Encoding.ASCII.GetBytes(Data)); arg1.Disconnect(); } static void sk_Disconnected(long obj) { //TO DO:To handle disconnect event } static void Proc_OnLine(IWorkingSocket arg1, byte[] arg2) { arg1.SendToQueue(arg2); } static void sk_OnError(Exception arg1, string arg2) { //TO DO:Process errors } } class HttpProcessor : IProcessor { private Dictionary<string, string> httpHeader; public HttpProcessor() { httpHeader = new Dictionary<string, string>(); } public event Action<IWorkingSocket,Dictionary<string, string>> OnRequest; #region IProcessor 鎴愬憳 private IWorkingSocket Conn; public void Init(IWorkingSocket Sock) { Conn = Sock; } public void NextProcessor(IProcessor NextProcessor) { //濡傛灉鏆傛椂娌℃湁涓嬬骇澶勭悊鍣ㄧ殑鏃跺€欑暀绌? } public void PushData(byte[] Data, int ReadCount) { string line = Encoding.ASCII.GetString(Data, 0, ReadCount); if (line.Equals("\r\n")) { if (OnRequest != null) { OnRequest(Conn, httpHeader); } } string[] temp = null; if (line.Split(':').Length>1) { temp = line.Split(':'); httpHeader.Add(temp[0], temp[1]); return; } if (line.Split(' ').Length > 1) { temp = line.Split(' '); httpHeader.Add(temp[0], temp[1]); return; } } #endregion #region IDisposable 鎴愬憳 public void Dispose() { httpHeader.Clear(); Conn = null; } #endregion } }<!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com -->
运行后,打开IE,输入 http://localhost:8888,得到结果如下:
发表评论
-
关于ORM和内存数据库的遐想
2007-01-23 13:21 571最近有消息说韩国电信 ... -
继续ORM-欧德巴赫猜想-Mapping
2007-01-23 14:34 666最近从项目组单离出来开始在公司实施过程化管理,整个QA Off ... -
剑走偏锋,小心走火入魔
2007-01-23 15:07 706这是很久前写好的文字,闲得无聊就发上来,几个月前的感想,上午一 ... -
手把手教你写ORM(三)
2007-01-24 11:50 605昨天处于晕死状态,少写了一个组件,还需要一个组件用来专门管理C ... -
手把手教你写ORM(四)
2007-01-24 13:51 641现在中午不睡一会儿就头晕。前一篇有人留言说为什么不写web.c ... -
手把手教你写ORM(五)
2007-01-24 15:29 605CMMI是魔鬼继续上面的内容,这里我们要实现一个插件的结构来动 ... -
谈谈我们的学习和我们的Blog
2007-01-24 20:07 407第一,学习编程是一个很枯燥的过程,所以我们更要讲究效率(要把有 ... -
手把手教你写代码生成器(也算ORM的续)
2007-01-25 11:45 724因为ORM还是需要配置,还是需要EntityObject,所以 ... -
粒度细到控件的权限管理系统的设计(概要篇)
2007-01-25 21:40 1067其实这个设计是已经做过了,那个时候我才进公司还在试用期,给我的 ... -
粒度细到控件的权限管理组件(构想篇)
2007-01-26 10:34 748说老实话我现在还没开 ... -
手把手教你写ORM大全篇
2007-01-26 19:36 680根据dudu boss的建议将本系列作一个归纳,下一个系列正在 ... -
架构设计的非侵入性原则
2007-01-27 00:41 698最近常常看到JAVA社区热 ... -
手把手教你可复用SSO组件的设计(原理篇)
2007-01-27 14:55 759在结构设计上复用性 ... -
对《万事欠备设计先行》的一点想法,兼谈XP和CMMI
2007-01-29 09:31 651周末陪女友,故沉默了,其实大脑并没有沉默,之前看到《万事欠备设 ... -
手把手教你可复用的SSO组件设计(设计篇)
2007-01-29 16:24 593周末陪女朋友去了,没写,告罪,上班后急忙补上。 这里说到了可复 ... -
手把手教你可复用的SSO组件设计(实现篇)
2007-01-29 22:30 610费了一夜的功夫写完这些代码,有些凌乱,望见谅。 首先是对加密解 ... -
玩具级嵌入式内存对象数据库^V^
2007-02-01 19:46 496纯粹是为了好玩:} 最近几天很忙所以写得少了,昨天在清理硬盘的 ... -
差之毫厘谬以千里-计算中的精度问题
2007-02-27 10:04 587如果你只是i++来作计数 ... -
动态语言,涅磐重生还是死路一条?
2007-03-06 10:31 581最近花时间一直在看python和ruby,为了在Web应用又看 ... -
ASP.NET's MVC is what a joke!
2007-03-08 13:43 477很早前还在毁人不倦的 ...
相关推荐
企业级分布式应用服务EDAS是阿里巴巴提供的一款强大的中间件Platform-as-a-Service(PaaS)产品。它旨在帮助开发者更高效地部署、运行和管理分布式应用程序,特别是基于微服务架构的应用。EDAS的核心功能包括应用...
同时,还需要下载Pandora容器,这是一个专门用于EDAS的容器扩展,需要解压到Ali-Tomcat的deploy目录下。完成上述步骤后,开发者能够通过查看Pandora容器的目录结构来验证安装是否正确。 在开发工具方面,文档中提到...
- **3.3.1 RPC**: 远程过程调用机制,允许程序调用另一个地址空间上的程序。 - **3.3.2 ConfigServer (地址注册中心)**: 用于存储服务提供者和服务消费者的地址信息。 - **3.3.3 Diamond (配置中心)**: 用于集中管理...
阿里云企业级分布式应用服务(Enterprise Distributed Application Service, 简称 EDAS)是一个全面的PaaS平台,它为企业提供了从应用开发、部署、监控到运维的一站式解决方案。本快速入门将指导用户如何开始使用...
《鹰眼跟踪、EDAS燎原,看高性能服务框架EDAS的架构实践》这篇文档主要聚焦于阿里云的EDAS(Enterprise Distributed Application Service)服务框架,这是一个强大的分布式应用管理平台,旨在提供高效率、高性能的...
在"EDAS-HSF-BOOT"项目中,我们可以看到"pandora-hsf-boot-demo"这个文件,这通常是一个示例项目,用于展示如何使用HSF-BOOT来创建和消费HSF服务。Pandora是阿里巴巴开源的分布式系统治理平台,它集成了HSF,可以...
阿里edas开发工具包,
3. **服务消费者**:服务消费者同样是一个Spring Boot应用,通过HSF客户端组件与EDAS注册中心交互,获取服务提供者的列表。HSF客户端会根据预设的策略(如轮询、随机等)选择一个服务实例进行调用。 4. **发布订阅...
EDAS提供了一个完整的分布式应用程序解决方案,包括应用程序开发、测试、部署、运维等各个方面。 EDAS API是EDAS的核心组件之一,提供了一组丰富的API接口,允许用户通过API调用来访问EDAS的各种功能。通过EDAS API...
轻量配置中心edas-lite-configcenter端口修改,默认8080、9600,因为有些安全限制敏感端口,改为18080,19600
阿里云的分布式应用服务EDAS(Enterprise Distributed Application Service)是一个基于云计算的企业级解决方案,它集成了阿里巴巴中间件团队的成熟分布式技术,旨在为企业提供高效、可扩展且稳定的分布式应用托管...
【EDAS开发培训(初级)v1.0.5.pptx】是一份关于阿里云的EDAS(Enterprise Distributed Application Service)开发的初级培训材料。EDAS是阿里巴巴为企业级云计算市场提供的高可用分布式解决方案,它基于阿里巴巴...
当一个服务实例启动后,它会向配置中心注册自身的信息,包括服务名、IP、端口等,其他服务可以通过配置中心找到并调用这些服务。 3. **实时推送**:一旦配置发生改变,配置中心会立即推送给所有订阅了该配置的服务...
1. 企业级分布式应用服务EDAS产品简介:EDAS是一款企业级分布式应用服务,旨在帮助用户构建高可用、可扩展、安全的分布式应用系统。 2. 产品版本和文档版本:当前文档版本为V3.1.0,文档版本为20171129。 3. 法律...
2. 使用自己启动的EDAS配置中心,开发者可以快速启动一个EDAS配置中心,将jmenv.tbsite.net指向启动了EDAS配置中心的机器IP,连接自己启动好的配置服务。 在选择使用EDAS配置中心时,需要考虑以下几点: * 在开发...
通过精心设置SSC工作模式和选择合适的外部时钟输入,再配合使用简单的CPLD进行波形编码和解码,可以构建出一种高效且稳定的专用数据采集系统。这种系统不仅能够应对大数据量的挑战,而且在提高数据处理效率、保证...
EDAS是一个企业级分布式应用服务,提供了企业级的分布式应用解决方案,帮助企业快速构建和部署分布式应用程序。该产品具有高可扩展性、可靠性和高性能等特点。 功能特性部分详细介绍了EDAS的各种功能特性,包括应用...
地震波分析处理软件EDAS-24-SMS3.EXE