HTTPの動作

以下は、HTTPのクライアント側プログラムの例です。各問に対する答えを、テキストフィールドに入力して「チェック」ボタンをクリックしなさい。

package tcp;
import java.io.*;	//InputStreamReaderやOutputStreamを使えるようにする宣言
import java.net.*;	//InetAddressやSoket利用のため
public class TcpClient {
	public Socket socket;//ネットワークのTCP接続をカプセル化しているインスタンス
	public InputStream is;//上記接続相手からの受信用バイトストリーム
	public OutputStream os;//上記接続相手への送信用バイトストリーム
	public byte []headers = new byte[4096];//ヘッダ部記憶用
	public int headLength = 0;//上記配列に記憶したbyte数

	public TcpClient(Socket socket)throws Exception{
		this. socket = socket; //接続相手との通信用(IPとportがカプセル化)
		this. is = socket.getInputStream();
		this. os = socket.getOutputStream();
	}
	public void sendString(String data, String charsetName )throws Exception{
		byte []buf = data.getBytes(charsetName );
		this. os. write( buf ); //送信
	}
	public void receiveHeaders()throws Exception{
		int c = this. is. read();//1byte受信(終わりなら-1)
		headLength = 0;
		while( c != -1 && headLength < this. headers . length ){
			this. headers[headLength ++] = (byte)c;
			int i = headLength - 4;
			if( i >= 0 && headers[i] == '\r' && headers[i+1] == '\n' && headers[i+2] == '\r' && headers[i+3] == '\n') break;
			c = this. is. read();//1byte受信(終わりなら-1)
		}
	}
	public static void main(String []args) throws Exception{
		TcpClient client = new TcpClient( new Socket("127.0.0.1",80));
		String request="GET /index.html HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n";
		client .sendString(request, "utf-8");
		client . receiveHeaders();
		String header = new String( client.headers, 0, client. headLength) );
 		System.out.println( header );//受信したレスポンスのheaderを表示
	}
}

この実行でサーバに送るHTTP要求メッセージの内容を下に入力しなさい。

この実行でサーバから送られるHTTP応答メッセージの例を以下に示します。

HTTP/1.1 200 OK
Server: My Test Server
Accept-Ranges: bytes
Content-Length: 187
Connection: close
Content-Type: text/html

<!DOCTYPE html>
<html lang="ja">
<head>
	・・以下省略・・
上記の  が、HTTP応答メッセージのヘッダ部で、 任意数続いた後、空の改行で区切られてボディ部が続きます。
この構造は、HTTPの要求、応答メッセージそれぞれで決められています。⇒参考
HTTP応答メッセージの先頭行は、「ステータスライン」呼ばれます。
HTTP要求メッセージで示すファイルが存在しない時の応答メッセージ「ステータスライン」を下に入力しなさい。