本文主旨:通过JAVA语言实现一个基于HTTP协议的web服务器来阐释HTTP协议原理
非常郁闷,今天停了一天的电,无语。本来还准备今天早上起来上机的,结果呢,停电郁闷。索性躺床上看书,哈哈,顿时觉得Nmap好强大。几乎可以实施TCP/IP/UDP/ICMP …. 的扫描,还可以分组,分片,自定义HTTP报文,自定义SYN/ACK/RST等等。很黄很暴力…好了书归正传,今天来说说http协议,要很好的理解协议无非就是从最原始的最底层的原理来解析。至于TCP/IP三次握手机制呢,不是今天的内容,就pass掉。直接从请求开始,我们假设链接已经建立完毕了。
下面呢就是我对协议的大致理解,整个请求与响应的过程,抛砖引玉哈。之后呢通过一个基于HTTP协议的JAVA WEB服务器来阐释。
Web Browser Client Request —> serverSocket.accept() —> Processor start()
—> Deal with HTTP Request Package —> Return Protocol Infomation and Request Object
—>Deal With Request Object Which Got From Request —> Return Resault .
再次抛砖引玉哈、、、如下:
首先是server的主程序
下载: MyServer.java
- package MyServer;
- /****************************************
- * This a simple java http server ..
- * Daniel Sun @ 公元2008.10.25
- */
- import java.io.IOException;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class MyServer {
- private ServerSocket serverSocket;
- private static final int HTTP_PORT = 8080;
- public void startSever(int port) {
- //启动
- try {
- serverSocket = new ServerSocket(port);
- System.out.println("My Server has Started at port :" + port);
- while (true) {
- Socket socket = serverSocket.accept(); // Socket socket = serverSocket.accept();
- new Processor(socket).start();
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- MyServer server = new MyServer();
- if (args.length == 1) {
- //new MyServer().startSever(Integer.parseInt(args[0]));
- server.startSever(Integer.parseInt(args[0]));
- } else {
- //new MyServer().startSever(HTTP_PORT);
- server.startSever(MyServer.HTTP_PORT);
- }
- }
- }
接下来是处理请求的线程:
下载: Processor.java
- package MyServer;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.PrintStream;
- import java.net.Socket;
- public class Processor extends Thread {
- private InputStream input;
- private PrintStream out;
- private static final String WEB_ROOT = "D:\\MyDocuments\\workspace\\MyEclipse\\MyServer\\WebRoot";
- public Processor(Socket socket) {
- // 初始化进程
- try {
- input = socket.getInputStream();
- out = new PrintStream(socket.getOutputStream());
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public void run() {
- String fileName;
- try {
- fileName = parse(input);
- readFile(fileName);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public String parse(InputStream input) throws IOException {
- // 根据HTTP协议,分析HTTP请求
- BufferedReader in = new BufferedReader(new InputStreamReader(input));
- String httpRequest = in.readLine();
- if (httpRequest == null || httpRequest.length() == 0) {
- sendError(400, "Client Request Error");
- return null;
- }
- String[] requestContent = httpRequest.split(" ");
- if (requestContent.length != 3) {
- sendError(400, "Client Request Error");
- }
- String statusCode = requestContent[0];
- String requestFileName = requestContent[1];
- String protocolVersion = requestContent[2];
- System.out.println("Protocal Version :" + protocolVersion
- + "\n Request Status Code : " + statusCode
- + "\n Request File Name :" + requestFileName);
- in.close();
- return requestFileName;
- }
- // 文件读写
- public void readFile(String fileName) throws IOException {
- // 生成一个文件对象
- File file = new File(Processor.WEB_ROOT + fileName);
- // 判断文件对象是否存在
- if (!file.exists()) {
- sendError(404, "File Not Found");
- }
- // 把文件读入输入流
- InputStream in = new FileInputStream(file);
- // 创建一个与文件长度相等二进制数组,把文件读入
- byte[] inputContent = new byte[(int) file.length()];
- in.read(inputContent);
- out.println("HTTP/1.0 200 sendFile");
- out.println("Content-length: " + inputContent.length);
- out.println();
- out.write(inputContent);
- // 把文件从输入流中有输出流读出
- out.write(inputContent);
- out.flush();
- out.close();
- in.close();
- }
- public void sendError(int statusCode, String ErrorMessage) {
- // 发送错误信息,HTTP请求是否正确,请求的文件是否是授权访问的,文件是否存在
- System.out.println("Error Status :" + statusCode);
- System.out.println("Error Message :" + ErrorMessage);
- }
- }


好东西直接等你分享了,我自己是看不懂那些代码的:)
回复
汗~只能纯留言~
PS:底部导航怎么是前后颠倒的~
回复
赞一个,博主还是学生吗?
回复
挖,又换主题,又改风格~
看不懂…
回复
[...] JAVA实现HTTP Server — 浅析HTTP协议 | Allove of Paradise (tags: java 技术收藏 httpserver) Related Postslinks for 2009-01-05 星座教程_星座频道_新浪网 (tags: 星盘 …links for 2009-01-03 M4中型坦克_百度百科 (tags: 坦克 M4 谢
话说我试过代码,其实是输不出网页内容的
回复
其实就是一个网络编程
回复
buy wellbutrin online – wellbutrin clomid online – clomid buy xenical – xenical order xenical – xenical orlistat buy propecia online – propecia buy adipex – adipex buy ambien – ambien buy valium online – valium buy tramadol – tramadol buy fioricet online – fioricet
回复