JAva HTTPプロトコルの実装要求

2088 ワード

Web開発をしてしばらく経ちましたが、HTTPプロトコルについては深く理解して勉強したことがありません.小さなテストをしてやっとHTTPプロトコルを徹底的に理解しました.自分のサーバにApacheサービスがインストールされ、起動しています.Apacheサービスは80ポートで傍受されています.
import java.io.*;
import java.net.*;

public class HttpRequest
{
	public static void main(String []args)throws Exception{
		
		//   
        Socket socket = new Socket("localhost",80);  
		OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
		
		StringBuffer sb = new StringBuffer();
		sb.append("GET / HTTP/1.1\r
"); sb.append("Host:localhost\r
"); sb.append("Accept-Language:zh-cn\r
"); // sb.append("\r
"); out.write(sb.toString()); out.flush(); InputStreamReader buf = new InputStreamReader(socket.getInputStream()); String str=""; int num = 0; FileOutputStream output = new FileOutputStream(new File("D:\\menu.html")); str = getSockLine(buf); /** */ while(!str.equals("\r
")){ if(str.contains("Content-Length:")) { // num = Integer.parseInt(str.substring(15).trim()); } str = getSockLine(buf); } char bytes[] = new char[1024]; int nread = 0; while(num > 0) { //Content-Length: 。 , str.length 。 nread = buf.read(bytes, 0, 1024); String temp = new String(bytes,0,nread); output.write(temp.getBytes()); //output.write(b, off, len) // int len = temp.getBytes().length; num -= len; if(num<=0)break; } output.flush(); output.close(); buf.close(); socket.close(); } private static String getSockLine(InputStreamReader buf) throws IOException { StringBuffer sb = new StringBuffer(""); int n; while( (n=buf.read()) != -1) { sb.append((char)n); if( ((char)n) =='\r') { n = buf.read(); if(((char)n)=='
') { sb.append('
'); break; } } } return sb.toString(); } }

返される内容はhtmlファイル(つまり、私たちが普段ソースを見ているときに見たもの)です.ブラウザは各ラベルとスタイルを解析し、解析の結果を出力する画面に表示されます.これが私たちが見たページ効果です.