HTTP头部详解及使用Java套接字处理HTTP请求
作者: claymore 发表于: 2009-12-01 05:15:08
进行Web开发关键是要了解超文本传输协议(HTTP),该协议用来传输网页、图像以及因特 网上在浏览器与服务器间传输的其他类型文件。只要你在浏览器上输入一个URL,最前面的http://就表示使用HTTP来访问指定位置的信息。(大部分 浏览器还支持其他一些不同的协议,其中FTP就是一个典型例子。)
本文从HTTP协议的结构上初步探讨HTTP协议的工作原理和请求响应格式,并最后通过一个使用Java编写的小HTTP服务器验证了如何处理和响应HTTP请求
HTTP由两部分组成:请求和响应。当你在Web浏览器中输入一个URL时,浏览器将根据你 的要求创建并发送请求,该请求包含所输入的URL以及一些与浏览器本身相关的信息。当服务器收到这个请求时将返回一个响应,该响应包括与该请求相关的信息 以及位于指定URL(如果有的话)的数据。直到浏览器解析该响应并显示出网页(或其他资源)为止。
HTTP请求
HTTP请求的格式如下所示:
<request-line>
<headers>
<blank line>
[<request-body>]
在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之 后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。
阅读全文...
分类: Programming | Java
引用: 0
评论: 0
点击: 81
TIOBE Programming Community Index for June 2009
作者: claymore 发表于: 2009-06-05 23:21:04
The TIOBE Programming Community index gives an indication of the popularity of programming languages. The index is updated once a month. The ratings are based on the number of skilled engineers world-wide, courses and third party vendors. The popular search engines Google, MSN, Yahoo!, Wikipedia and YouTube are used to calculate the ratings. Observe that the TIOBE index is not about the best programming language or the language in which most lines of code have been written.
The index can be used to check whether your programming skills are still up to date or to make a strategic decision about what programming language should be adopted when starting to build a new software system. The definition of the TIOBE index can be found here.
| Position Jun 2009 |
Position Jun 2008 |
Delta in Position | Programming Language | Ratings Jun 2009 |
Delta Jun 2008 |
Status |
|---|---|---|---|---|---|---|
| 1 | 1 | ![]() |
Java | 20.147% | -0.74% | A |
| 2 | 2 | ![]() |
C | 16.779% | +1.27% | A |
| 3 | 3 | ![]() |
C++ | 10.594% | -0.21% | A |
| 4 | 4 | ![]() |
PHP | 9.675% | -0.53% | A |
| 5 | 5 | ![]() |
(Visual) Basic | 7.943% | -1.84% | A |
| 6 | 7 | ![]() |
Python | 4.756% | -0.14% | A |
| 7 | 8 | ![]() |
C# | 4.536% | +0.48% | A |
| 8 | 9 | ![]() |
JavaScript | 4.021% | +1.09% | A |
| 9 | 6 | ![]() ![]() ![]() |
Perl | 3.909% | -1.64% | A |
| 10 | 10 | ![]() |
Ruby | 2.629% | -0.01% | A |
| 11 | 11 | ![]() |
Delphi | 2.182% | +0.16% | A |
| 12 | 14 | ![]() ![]() |
PL/SQL | 0.879% | +0.12% | A |
| 13 | 26 | ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
RPG (OS/400) | 0.778% | +0.53% | A-- |
| 14 | 13 | ![]() |
SAS | 0.759% | -0.16% | A |
| 15 | 15 | ![]() |
Pascal | 0.759% | +0.16% | A |
| 16 | 27 | ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
ABAP | 0.726% | +0.49% | A-- |
| 17 | 12 | ![]() ![]() ![]() ![]() ![]() |
D | 0.620% | -0.83% | A-- |
| 18 | 16 | ![]() ![]() |
Lisp/Scheme | 0.607% | +0.17% | B |
| 19 | 19 | ![]() |
Lua | 0.557% | +0.19% | B |
| 20 | 23 | ![]() ![]() ![]() |
MATLAB | 0.527% | +0.26% | B |
阅读全文...
标签: TIOBE index 排行榜
分类: Programming | Related
引用: 0
评论: 0
点击: 7
面向对象的设计原则-类设计原则
作者: claymore 发表于: 2009-05-20 16:01:17
在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。
1. 开闭原则(the Open Closed Principle OCP)

图1 OCP应用(收音机)
1. 开闭原则(the Open Closed Principle OCP)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一。
我们以收音机的例子为例,讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节。但是对于不同的收音机,实现这三个步骤的细节往往有所不同。比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。因此,我们不太可能针对每种不同类型的收音机通过一个收音机类来实现(通过重载)这些不同的操作方式。但是我们可以定义一个收音机接口,提供开机、关机、增加频率、降低频率、增加音量、降低音量六个抽象方法。不同的收音机继承并实现这六个抽象方法。这样新增收音机类型不会影响其它原有的收音机类型,收音机类型扩展极为方便。此外,已存在的收音机类型在修改其操作方法时也不会影响到其它类型的收音机。
图1是一个应用OCP生成的收音机类图的例子:
我们以收音机的例子为例,讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节。但是对于不同的收音机,实现这三个步骤的细节往往有所不同。比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。因此,我们不太可能针对每种不同类型的收音机通过一个收音机类来实现(通过重载)这些不同的操作方式。但是我们可以定义一个收音机接口,提供开机、关机、增加频率、降低频率、增加音量、降低音量六个抽象方法。不同的收音机继承并实现这六个抽象方法。这样新增收音机类型不会影响其它原有的收音机类型,收音机类型扩展极为方便。此外,已存在的收音机类型在修改其操作方法时也不会影响到其它类型的收音机。
图1是一个应用OCP生成的收音机类图的例子:

图1 OCP应用(收音机)
阅读全文...
标签: 面向对象 原则 设计 OOP
分类: Programming | Related
引用: 0
评论: 0
点击: 15
某Python实现的尾部递归
作者: claymore 发表于: 2009-05-01 23:33:08
分类: Programming | Related
引用: 0
评论: 0
点击: 15
编程语言流行排名
作者: claymore 发表于: 2009-04-28 18:32:13
下面的这些排名并不是非常科学的,它们只是从某种方面表现出了编程语言的流行程度。仅供参考。
Yahoo Search
这里,我们使用了Yahoo Search API,简单地搜索了一下相关的编程语言。收搜字样是”language programming”,下面是搜索到的页面结果。也许这能够说明语言的流行程度。

工作相关
接下来,我们来看看与工作相关的页面。也是从Yahoo Search API中从Craigslist.org网站中取得这些数据。搜索模型如下:language programmer -”job wanted” site:craigslist.org。这个结果可以看到全球的雇主在雇佣技术人员的时候所要求的编程语言的数量分布。
接下来,我们来看看与工作相关的页面。也是从Yahoo Search API中从Craigslist.org网站中取得这些数据。搜索模型如下:language programmer -”job wanted” site:craigslist.org。这个结果可以看到全球的雇主在雇佣技术人员的时候所要求的编程语言的数量分布。

技术书籍
下面是由Amason所提供的搜索API中得到的目前出版物中的编程语言相关的统计数据,一般来说,越流行的语言通常会有更多的书籍。我们来看看书籍方面的各语言的书籍数量的排行榜。
下面是由Amason所提供的搜索API中得到的目前出版物中的编程语言相关的统计数据,一般来说,越流行的语言通常会有更多的书籍。我们来看看书籍方面的各语言的书籍数量的排行榜。

Google Code 开源项目
下面的结果取自Googel Code (http://www.google.com/codesearch),我们通过统计开源项目所使用的语言来查看是哪种语言在开源项目中的流行程度。
阅读全文...
标签: 编程 排名
分类: Programming | Related
引用: 0
评论: 0
点击: 9
有效编程的14件事
作者: claymore 发表于: 2009-04-16 22:48:29
下面是14件如何有效编程的方法:
-
计划(Plan)所谓Plan,其实就是对应于编程中的“设计”阶段,当然,这里的Plan并不像设计那样重量级。它要求我们程序员在正式编程前至少要考虑一下下面的问题:
- 你这个程序,工具或是项目的目的,究竟是用来干什么的。你只有知道做什么,要达到什么样的目的,你才能做得对,做得好。
- 需要有什么样的功能。需要你给出来个功能列表。这样可以保证我们不会遗露了什么。
- 准备好一些技术难题的前期调查和解决方案。不要等到开始编程的时候才去想。
下面这你因为有“Plan”而得到的好处:- 你能够清楚地明白你要做的东西长什么样?
- 你能清楚知道你要开发的东西要干些什么事?
- 你能够在开发过程中解决你所有可能发生的难题。
-
使用伪代码伪代码是一个非常不错的方式,让你可以看到你要写的程序长什么样?根据 维基百科(Wikipedia),伪代码被写定义成这样:
阅读全文...
标签: 编程 效率
分类: Programming | Related
引用: 0
评论: 0
点击: 17
未来五年程序员需要掌握的10项技能
作者: claymore 发表于: 2009-04-14 19:04:45
由于最近经济形势的变化,很多开发人员只关注他们短期的工作前景。与此同时,把时间和精力花在学习最能带来回报的新技术上是件非常重要的事情。这里是我们列举的10种你需要马上开始学习的技术,让你的简历在未来5年不会落伍。这个列表并不完全,有很多业界的领域(比如大型机开发人员)没有涉及。尽管如此,对通常的主流开发来说,学习其中至少7项技能肯定不会错 ——不但要达到能在面试时侃侃而谈的程度,还得能在工作中运用自如。
1) 编程语言三选一 (.NET, Java, PHP)
除非开发世界有根本的改变(类似小行星击中雷德蒙),在不远的将来,大部分开发人员将需要了解三大开发平台——.NET (VB.NET或者C#), Java, 或者PHP——中的至少一个。并且只了解核心语言也是不够的。因为项目会包含越来越多不同的功能,你需要对相关框架和库有深入的了解。(本人以为C/C++可能比这三个语言更有竞争力)
除非开发世界有根本的改变(类似小行星击中雷德蒙),在不远的将来,大部分开发人员将需要了解三大开发平台——.NET (VB.NET或者C#), Java, 或者PHP——中的至少一个。并且只了解核心语言也是不够的。因为项目会包含越来越多不同的功能,你需要对相关框架和库有深入的了解。(本人以为C/C++可能比这三个语言更有竞争力)
2) 互联网Rich Application (RIAs)
不管爱她还是恨她,最近几年,Flash的用途突然间不仅仅是制作政治人物弱智歌曲演唱动画而已了。Flash也萌生出了以Flex和AIR为形式的附加功能。Flash的竞争对手,比如JavaFx和Silverlight,也在不停的在特性和性能上加筹码。HTML5集成了所有RIA的功能,包括数据库连接,而W3C正式地贴上了AJAX的标签。在不久的将来,RIA专家将会是简历的一个重要筛选条件。
不管爱她还是恨她,最近几年,Flash的用途突然间不仅仅是制作政治人物弱智歌曲演唱动画而已了。Flash也萌生出了以Flex和AIR为形式的附加功能。Flash的竞争对手,比如JavaFx和Silverlight,也在不停的在特性和性能上加筹码。HTML5集成了所有RIA的功能,包括数据库连接,而W3C正式地贴上了AJAX的标签。在不久的将来,RIA专家将会是简历的一个重要筛选条件。
阅读全文...
标签: 程序员 技能
分类: Programming | Related
引用: 0
评论: 0
点击: 19
程序员需要具备的基本技能
作者: claymore 发表于: 2009-04-11 20:05:34
软件开发是一个跨度很大的技术工作,在语言方面,有C,C++,Java,Ruby等等等等,在环境方面,又分嵌入式,桌面系统,企业级,WEB,基础系统,或是科学研究。但是,不管是什么的情况,总是有一些通用的基本职业技能。
这些最基本的职业技能通常决定了一个程序员的级别,能否用好这些技能,直接关系到了程序员的职业生涯。很多程序新手也是因为缺少、达不到或是不熟悉在这些基本技能,所以,他们需要有老手带,需要努力补齐这些技能。而高级程序员应该非常熟悉这些基本技能,而且有能力胜任并带领其他经验不足的程序员。
下面这些基本职业技术可以用来做为对一个程序员的评估,很明显,下面的这些技能都可以用来做面试。虽然,还有很多非技术的因素,但对于评估一个程序员的技术能力来说,其应该是足够的了。
下面是程序员所应该具备的基本职业技能:
| 基本技能 | 技能描述 |
|---|---|
| 阅读代码 | 这个技能需要程序员能够具备读懂已经存在的代码的能力,这样的能力可以让程序员分析程序的行为,了解程序,这样才能和开发团队一起工作,继承维护或是改进现有的程序。 |
| 编写程序 | 编写程序并不包括程序设计。不要以为编程是一件很简单的事情,很多程序员都认为编程只需要懂得程序语言的语法,并把设计实现就可以了。但是这离编写程序还远远不够,使用什么样的编码风格成为编写程序员最需要具备的基本技能。能否使用非常良好的编程风格直接决写了程序员的级别。 |
| 软件设计 | 这一能力直接决定了需要吏用什么样的代码技术达到怎么样的功能,而系统架构设计直接决定了软件的质量、性能和可维护性。并不是所有的程序在这一方面都非常优秀,但每个程序员都需要或多或少的明白和掌握这一基本技能。 |
| 熟悉软件工程 | 每个程序员都应该明白软件工程是什么东西,都应该知道,需求分析,设计,编码,测试,Release和维护这几个阶段。当然,几乎所有的人都知道这些东西,但并不是每个人都很清楚这些东西。现在很多高级程序员都会混淆“需求规格说明书FS”和“概要设计HLD”。另外,程序员还需要知道一些软件开发的方法论,比如:敏捷开发或瀑布模型。 |
| 使用程序库或框架 | 一个程序员需要学会使用已有的代码,无论是标论的程序库,或是第三方的,还是自己公司内部的,都需要学会做。比如:C++中,需要学会使用STL,MFC,ATL,BOOST,ACE,CPPUNIT等等。使用这些东西,可以让你的工作事半功倍。 |
| 程序调试 | 程序调试是分析BUG和解决问题最直接的能力。没有人能够保证程序写出来不用调试就可以运行正常,也没有人可以保证程序永远不会出BUG。所以,熟练使用调试器是一个程序员需要具备的基本技能。 |
| 使用IDE | 学会使用IDE工具也会让你的工作事半功倍。比如,VC++,Emacs,Eclipse等等,并要知道这些IDE的长处和短处。 |
| 使用版本控制 | 一定要学会使用版本控制工具,什么叫mainline/trunk,什么叫tag,什么叫branch,怎么做patch,怎么merge代码,怎么reverse,怎么利用版本控制工具维护不同版本的软件。这是程序员需要明的的软件配置管理中最重要的一块。 |
| 单元测试 | 单元测试是每个程序都需要做的。很多单元测试也是需要编码的。一定要学会在xUnit框架下进行单元测试。比如JUnit, NUnit, CppUnit等等。 |
| 重构代码 | 每个程序员都需要有最基本的能力去重构目前已有的代码,使代码达到最优但却不能影响任何的已有的功能。有一本书叫《软件的重构》,每个程序员都应该读一下。 |
| 自动化编译 | 程序员需要使用一个脚本,其能自动化编程所有的工程和代码,这样,整个开发团队可以不停地集成代码,自动化测试,自动化部署,以及使用一些工具进行静态代码分析或是自动化测试。 |
阅读全文...
标签: 程序员 技能
分类: Programming | Related
引用: 0
评论: 0
点击: 8
程序员的4个境界,你属于那个境界
作者: claymore 发表于: 2009-04-10 18:40:49
在成为程序员的道路上,要经历四个坎坷,让我们用四个境界来标明他们。
第一境界,就是前面所说的,掌握一门或者几门编程语言,会模仿例子来实现程序代码,并且让代码在计算机系统中运行起来。达到这个境界人,还不能算是真正意义上的程序员,而仅仅是掌握了一种或者几种工具的工匠,他们中的熟练者能够快速模仿现成的例子,以实现自己或者用户需要的软件模块。
非常遗憾,许多 “程序员”仅仅达到第一个境界,他们根据手中的文档和参考资料,通过“模仿”来完成工作,他们实现的程序只是无数个前人已经实现过的代码的翻版组合,虽然其中的熟练者以快速高效率完成任务著称,然而他们的作品中毫无新意,日复一日地重复代码,罕有任何可以称之为“创新”的东西。
第一境界的特质是对语言工具的掌握,在这个境界的高手,会强调自己对语言如何如何熟练,因此这个境界可以用“知器”来表示。
第二境界里,我们要学习的是分解问题和推理的技巧,学会用逻辑的语言来精确地表达一个命题。在这个境界里,软件工作者掌握的是一种分析具体事物的方法,他们不再一味地模仿,而是开始对一个又一个具体问题思考并尝试用自己的方法来更好地解决。
第一境界,就是前面所说的,掌握一门或者几门编程语言,会模仿例子来实现程序代码,并且让代码在计算机系统中运行起来。达到这个境界人,还不能算是真正意义上的程序员,而仅仅是掌握了一种或者几种工具的工匠,他们中的熟练者能够快速模仿现成的例子,以实现自己或者用户需要的软件模块。
非常遗憾,许多 “程序员”仅仅达到第一个境界,他们根据手中的文档和参考资料,通过“模仿”来完成工作,他们实现的程序只是无数个前人已经实现过的代码的翻版组合,虽然其中的熟练者以快速高效率完成任务著称,然而他们的作品中毫无新意,日复一日地重复代码,罕有任何可以称之为“创新”的东西。
第一境界的特质是对语言工具的掌握,在这个境界的高手,会强调自己对语言如何如何熟练,因此这个境界可以用“知器”来表示。
第二境界里,我们要学习的是分解问题和推理的技巧,学会用逻辑的语言来精确地表达一个命题。在这个境界里,软件工作者掌握的是一种分析具体事物的方法,他们不再一味地模仿,而是开始对一个又一个具体问题思考并尝试用自己的方法来更好地解决。
阅读全文...
标签: 程序员 境界
分类: Programming | Related
引用: 0
评论: 0
点击: 13
惹恼程序员的十件事
作者: claymore 发表于: 2009-04-07 18:08:44
第十位 程序注释
程序注释本来是一些比较好的习惯,当程序员老手带新手的时候,总是会告诉新手,一定要写程序注释。于是,新手们当然会听从老手的吩咐。只不过,他们可能对程序注释有些误解,于是,我们经常在程序中看到一些如下的注释:
r = n/2; //r是n的一半
//循环,仅当r- n/r不大于t
while ((r-n/r) <=t){
… …
r = 0.5 * (r-n/r); // 设置r变量
}
while ((r-n/r) <=t){
… …
r = 0.5 * (r-n/r); // 设置r变量
}
每当看到这样的注释——只注释是什么,而不注释为什么,相信你一定会被惹火,这是谁写的程序注释啊?不找来骂一顿看来是不会解气了。程序注释应该是告诉别人你的意图和想法,而不是告诉别人程序的语法,这是为了程序的易读性和可维护性,这样的为了注释而注释的注释,分明不是在注释,而是在挑衅,惹毛别人当然毋庸置疑。
阅读全文...
标签: 程序员 烦恼
分类: Programming | Related
引用: 0
评论: 0
点击: 21













