JAva HTTPプロトコルの実装要求
2088 ワード
Web開発をしてしばらく経ちましたが、HTTPプロトコルについては深く理解して勉強したことがありません.小さなテストをしてやっとHTTPプロトコルを徹底的に理解しました.自分のサーバにApacheサービスがインストールされ、起動しています.Apacheサービスは80ポートで傍受されています.
返される内容はhtmlファイル(つまり、私たちが普段ソースを見ているときに見たもの)です.ブラウザは各ラベルとスタイルを解析し、解析の結果を出力する画面に表示されます.これが私たちが見たページ効果です.
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ファイル(つまり、私たちが普段ソースを見ているときに見たもの)です.ブラウザは各ラベルとスタイルを解析し、解析の結果を出力する画面に表示されます.これが私たちが見たページ効果です.