一直都在学习Socket编程,因为觉得有了socket就可以将网络上的数据轻松掌握。但是可惜自己实在太笨了,又没有高手指点,所以就一直自己在原地打转,一步都没能前进,因为对于一个非计算机专业的,纯靠个人爱好的我来说,一开始就用C语言太难了!所一我用了一段时间的Python语言,这个语言还可以,比较简单。有了这点基础后,我还是觉得应该回归C语言,用C来写Socket的程序。
我也稍稍接触过C++,C#,但是总觉得C#太多的封装,已经不能弄清楚到底是怎么回事了,看不清真面目,C++还可以,但是用C++如果不用那些大量封装好的神秘的库,与C似乎也没什么不同。
还是踏踏实实的学吧!
socket无非就是建立socket,连接,发送请求,获取信息而已,建立socket,连接者都是很简单的,但是发送信息有点难了点。总觉得写HTTP请求头是件很难的事。先分析一段代码(http://blog.chinaunix.net/u/11624/showart_434097.html ):
重点是看如何发送的HTTP请求。
HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content - Length除外。对于POST请求来说Content - Length必须出现。
下面是一些最常见的请求头:
Accept:浏览器可接受的MIME类型。
Accept - Charset:浏览器可接受的字符集。
Accept - Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
Accept - Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Authorization:授权信息,通常出现在对服务器发送的WWW - Authenticate头的应答中。
Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep - Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content - Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
Content - Length:表示请求消息正文的长度。
Cookie:这是最重要的请求头信息之一,参见后面《Cookie处理》一章中的讨论。
From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
Host:初始URL中的主机和端口。
If - Modified - Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。
Pragma:指定“no - cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User - Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
UA - Pixels,UA - Color,UA - OS,UA -
CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。
有关HTTP头完整、详细的说明,请参见http : //www.w3.org/Protocols/ 的HTTP规范。
对与我所需要的小程序,一个GET 在接一个所请求的文件名,然后是HTTP版本用HTTP/1.1就可以了。之后是各个关键字和值对。每个关键字及值之间用":"隔开,可一在":"前后加若干份额空格,但是注意的是关键字前是不能有空格,否则服务器会说是bad request! 之后也可以加如若干空格。每个关键字-值对之后都是以/r/n结束的。GET请求行也是。最后一个关键字-值对是以/r/n/r/n结束的,否则服务器端没有响应的。这里的Host也是不用写的。因为连接时已经确定了主机了。(注意:关键字-值对一般是以大写字母开头的。)Connection:Close是要加的。否则程序是不退出的。(由于现在是初级阶段,暂时先不分析这些原因。只是知道现象就暂时可以了。)
其实这么看起来除了建立连接的时候费了一点事,其它的时候还是很简单的,因为C自身对字符串的支持较差,所以处理文字什么的自然就很费时了。

被折叠的 条评论
为什么被折叠?



