使用Java socket 实现 HTTP 协议

来源:互联网 发布:linux服务器更换硬盘 编辑:程序博客网 时间:2024/05/21 09:02

突然发现 CSDN 可以使用MarkDown编辑器了,真是一种进步啊!不过貌似出来的太晚了,呵呵。

这篇文章我们讲一下如何使用 简单地Java socket 来实现部分的 HTTP协议。


1. 要实现HTTP协议必须要了解 HTTP协议

HTTP协议是超文本传输协议(Hypertext Transfer Protocol),在OSI七层模型之中属于应用层协议。

在传输层由TCP/IP协议负责消息的传输,HTTP协议并不用操心消息是如何发送的,那么HTTP协议重要的部分就是协议的内容了。

所以我们需要了解HTTP协议的内容,在程序中实现这些内容即可。

我们这里采用 HTTP/1.0。


2. 目标:我们简单地实现GET方法,在Ubuntu上跑自己的HTTP服务,采用chrome浏览器进行访问。


3. 程序(Process)要做的内容是十分简单地

> The client opens a connection(客户端建立连接,此时服务器也在等待连接)

> The client sends a request (GET, HEAD, or POST) (客户端发起请求,告诉服务器要做的内容)

> The client waits for a response (客户端等待服务器的相应)

> The server processes the request (服务器处理客户端的请求,也就是三个方法)

> The server sends a response (服务器发送自己的结果,也就是所谓的响应)

> The connection is closed (关闭连接)

可以看到在一个连接之后,就已经关闭了连接,所以 HTTP/1.0是一个无状态的协议。



4. 一些规定。

使用HTML格式进行编码的时候,编码规则有些不同: 比如字母表字符和0~9是同样的,空格" "被转换成一个加号 "+"。"." '," "-" "*" "_"是一样的。所有其他的字符都是不安全的并且会转化成 one or more bytes using some encoding scheme. Then each byte is represented by the 3-character string "%xy",其中"xy"是表示这个byte 的两个八进制数字。

比如:"The string ü@foo-bar" 会别转化成 "The+String+%C3%BC%40foo-bar",其中"ü"用%C3%BC表示,“@”用%40表示。

在Java中我们采用URLEncoder 和 URLDecoder来进行编码和解码。


5.  我们需要用一种格式来表示 资源。

比如我们想要得到服务器上的资源,客户端应该发送什么内容呢? 客户端应该了解服务器上的资源在哪里,然后请求这个资源,或者客户端知道服务器上的服务器在哪里,然后请求这个服务。

那么应该如何表示这个资源 或者 服务呢?

HTTP URIs:(Uniform Resource Identifier)

格式如下:http://Host[:Port]/Path[?QueryString]

其中QueryString包含了 由"&"分隔的 "name=value"这样的键值对。比如:name1=value1&name2=value2[&...]


6. 协议格式

GET(方法) without Headers (a.k.a., Simple_Request)

GET URI  HTTP/1.0 CRLF

CRLF

HEAD(方法:

HEAD URI HTTP/1.0 CRLF

CRLF


现在我们只需要按照这个格式进行传输就可以了。

其实最重要的就是协议的格式,比如当我们需要访问我们本地的HTTP server的时候,chrom传递的GET方法是什么格式?

我们需要解析这个格式,然后返回相应的内容 (如何返回内容?就是把所有的东西:format,data组装成一个 String,然后将这个string 写入到连接中,返回即可。)

然后chrome就可以显示相应的内容了。


看上去十分简单? 那么HTTP和分布式的内容有什么关系呢? 它的优点在哪里?

当我写完程序之后,下次分析。











https://users.cs.jmu.edu/bernstdh/web/common/lectures/slides_http-server-example_java.php

这个连接中的内容就是如何采用Java实现一个简单地HTTPServer。(但是不是采用Socket,我们需要采用Socket)。

















0 0
原创粉丝点击