真正的WEB服务器是不会用Indy写的。因为它是基于每连接每线程的。

其实真正的服务器需要下很多功夫,无法快速开发的。
比如说,字符串处理。玩服务器基本上就是玩内存。举个例子:

var
 str:AnsiString;
begin
 str:='HTTP 1.1/200 OK'#$D#$A;
 str:=str+xxxxxxx;
 str:=str+yyyyyyy;
 ......
end;

编译器实际上上怎么做的?第一行代码:先根据字符长度,为str分配17字节空间(这里不讨论头部计数器和锁占用的空间)。第二行代码,假设xxxxxx的长度为3,那么再申请一个20字节的空间,将原来17字节的内容拷贝过去,再在后面接上3个字节的内容,然后释放原来的17个字节。第三行同理。内存会变成怎么样?

[ 17个字节的空洞][ 20字节的新内容]..........

这个时候,如果你需要分配一个18字节的内存,只能从[ 20字节的新内容]后面申请,因为内存块必须是连续的。换句话说,前面那个17字节的内存就废了。除非分配的是小于等于17字节的。

随着运行的时间越来越长,类似的空洞会越来越多。最后,如果你是32位应用程序,那么有可能面临很多错误(比如说:GetMem失败,对象创建失败)。

MFC的CString实质上原理类似。

服务器开发跟桌面应用是两码事,因为桌面应用程序,从你启动到结束,一般就运行几个小时,但服务器是24小时*365运行的,需要注意的事情海了去。很多时候,一些好像不要紧的细节,累加起来,就有质的区别。

服务器开发,不是有一个不错的网络库就OK的。网络仅是负责数据的收发,你如何快速处理收到的数据呢(比如说,使用传统锁来生产者消费者队列,或者双队列,或者原子队列,或者真正逻辑上完全无锁队列)?如果避免更多的内核和应用层切换?启动多少个线程刚好合适?选用什么加密算法?等等等等。不要小看效率,假如你的服务器长连接峰值是10万,一个加密算法提示了10毫秒,10毫秒乘以10万就是16分钟,8核服务器在理想状态下,最后那个登录的可怜虫也要多等待2分钟。仅仅追求连接数是毫无意义的,如果你的机器性能够强大,如果你使用完成端口,如果客户端仅是连接而不用做其它事情,一个最蹩脚的程序员写的也能同时支持百万级别的连接。但这个是操作系统的功劳,跟你的程序关系不大。仅连接不做事情的程序也没什么用处。

当然,桌面程序开发人员是不用关心这些的。如果仅是开发http server,我强烈建议直接调用操作系统的http.sys,这个也是IIS的本质。除了避免内核和应用层的切换,还可以避免很多问题。你自己实现一个其实是不可能比这个更好---你用的操作系统都是人家的,你会比他更了解系统么?

http://bbs.2ccc.com/topic.asp?topicid=517080

http://www.codeproject.com/Articles/437733/Demystify-http-sys-with-HttpSysManager

http://blog.synopse.info/tag/http.sys

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364510(v=vs.85).aspx

基于http.sys来开发的,真的是非常稳定的更多相关文章

  1. Linux网络编程:基于TCP的程序开发回顾篇《转》

    面向连接的TCP程序设计 基于TCP的程序开发分为服务器端和客户端两部分,常见的核心步骤和流程: 其实按照上面这个流程调用系统API确实可以完全实现应用层程序的开发,一点问题没有.可随着时间的推移,你 ...

  2. 基于TINY4412的Andorid开发-------简单的LED灯控制【转】

    本文转载自:http://www.cnblogs.com/pengdonglin137/p/3857724.html 基于TINY4412的Andorid开发-------简单的LED灯控制   阅读 ...

  3. 基于ASP.Net Core开发的一套通用后台框架

    基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...

  4. 基于FPGA的以太网开发

    基于FPGA的以太网开发,在调试过的FPGA玩家开来,其实算不上很难的技术!但是如果只是菜鸟级别的选手,没有调试过的话,就有些头疼了!早在自己在实习的时候,就接触到XAUI(万兆以太网口)接口,但是由 ...

  5. 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(目录)

    本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以  SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...

  6. [转]基于Starling移动项目开发准备工作

    最近自己趁业余时间做的flash小游戏已经开发得差不多了,准备再完善下ui及数值后,投放到国外flash游戏站.期间也萌生想法,想把游戏拓展到手机平台.这两天尝试了下,除去要接入ane接口的工作,小游 ...

  7. 最新基于adt-bundle-windows-x86的android开发环境筹建

    最新基于adt-bundle-windows-x86的android开发环境搭建 某系统要配套做一个android客户端,来一次android开发环境快速搭建,系统Win7,具体步骤如下: 1.下载j ...

  8. 基于Typecho CMS框架开发大中型应用

    基于Typecho CMS框架开发大中型应用 大中型应用暂且定义为:大于等于3个数据表的应用!汗吧! Typecho原本是一款博客系统,其框架体系有别于市面上一般意义MVC框架,主体代码以自创的Wid ...

  9. Android基于XMPP Smack openfire 开发的聊天室

    Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...

随机推荐

  1. [转]WINDOW进程通信的几种方式

    windows进程通信的几种方式 1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待.因此,进程不必使用文件I/O操作,只需简单的指针 ...

  2. 彻底删除sql server的方法

    请先确定是否把sql相关的东西删了,建议进行如下操作. 1.先下个Windows Install Clean Up,清理sql相关东西,要全部清理. 2.到控制面板--添加删除程序中看是否还有未删的. ...

  3. 51nod1417 天堂里的游戏

    ---恢复内容开始--- 1417 天堂里的游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 多年后,每当Noder看到吉普赛人,就会想起那个遥 ...

  4. wap网站获取访问者手机号PHP类文件

    <?php /** * 类名: mobile * 描述: 手机信息类 * 其他: */ class mobile { /** * 函数名称: getPhoneNumber * 函数功能: 取手机 ...

  5. cxgrid HyperLink 鼠标显示效果

    procedure TForm1.cxGrid1DBTableView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); v ...

  6. dell inspiorn 14vr 1616b ubuntu 无线网卡的问题

    找到两个解决方法: 1 找 网卡驱动下载: 用命令 以下 from :http://zhidao.baidu.com/link?url=k6QNIdJlbRyZJSEW1cVUs_1p4Jv-73c8 ...

  7. WPF中禁止WebBrowser控件打开新窗口

    一.针对纯WPF的WebBrowser控件: <summary> Suppress Script Errors In WPF WebBrowser </summary> pub ...

  8. 【原创】一起学C++ 之->(箭头符号) ---------C++ primer plus(第6版)

    1.C++新手在指定结构成员时,不知道何时用.运算符,何时是用->运算符. 结论:如果结构标识符是结构名,则使用句点运算符:如果标识符是指向结构的指针,则使用箭头运算符. #include &l ...

  9. C#向C++编写的DLL传递字符串参数的办法

    使用StringBuilder,举例: C++代码中函数定义如下: PVPOWERFORCASTDLL_API int PVPowerForcast(SForcastInfo &_Forcas ...

  10. 【学习总结】IOS程序运行过程 、UIWindow 、controller 、 UIView 创建过程的总结

    程序启动开始到view显示: 程序启动首先会执行main函数 - > UIApplicationMain函数: 程序启动 (加载框架,info文件,资源等) 执行Main函数 初始化UIAppl ...