网页项目练习version2---》version3

package cn.tedu.v2_1;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class WebServer {
	ServerSocket server;

	public WebServer() {
		try {
			server = new ServerSocket(8888);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void start() {
		while (true) {
			Socket socket;
			try {
				while (true) {
					System.out.println("等待客户端的请求");
					socket = server.accept();
					new Thread(new ClientHandler(socket)).start();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	class ClientHandler implements Runnable {
		Socket socket;
		public ClientHandler() {
		}
		public ClientHandler(Socket socket) {
			this.socket = socket;
		}
		@Override
		public void run() {
			//  \r\n必须是以这两个字符结尾的      ASCll:\r=13    \n=10
			System.out.println("接收客户端请求");
			try {
				InputStream in = socket.getInputStream();
				StringBuilder br=new StringBuilder();//创建一个序列字符串
				
				int d=-1;
				char c1=0,c2=0;//两个字符
				while((d=in.read())!=-1){
					c2=(char)d;
					//解析第一行
					if(c1==13&&c2==10){//c1=\r    c2=\n
						break;
					}
					br.append(c2);//将c2的值给br
					c1=c2;//不断得到最后的字节,直到c1=\r  c2=\n,通过if跳出循环
					
					System.out.print(c2);
					//System.out.print((char)d);
				}
				//System.out.println(br.toString().trim());//trim去掉空格的方法
				String str =br.toString().trim();
				String[] data = str.split(" ");
				System.out.println(data[0]);//请求方式
				System.out.println(data[1]);//url请求的资源的名称
				System.out.println(data[2]);//HTTP的协议名称、版本
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		new WebServer().start();
	}

}
//在网页输入:http://localhost:8888/
//结果:
/*
 * 等待客户端的请求
等待客户端的请求
等待客户端的请求
接收客户端请求
接收客户端请求
GET
/
HTTP/1.1
 */

第三个任务:
1.定义HttpRequest类
    1)定义HttpRequest类在com.tedu.http包中
    2)定义变量:method,url,protocol;
    3)定义带参的构造方法HttpRequest(InputStream in)
    4)定义三个变量的get方法
    5)定义方法:parseRquestLine(InputStream in):void
        方法的功能:解析请求行,给三个变量赋值
        在构造方法中调用
2.重构WebServer的run方法
    创建HttpRequest对象,调用get方法打印请求的方法,url,protocl
3.测试:打开浏览器客户端:http://localhost:8080/myweb/index.html

 WebServer.java

package cn.tedu.v3;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

import cn.tedu.v3.http.HttpRequest;

public class WebServer {
	ServerSocket server;

	public WebServer() {
		try {
			server = new ServerSocket(8888);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void start() {
		while (true) {
			Socket socket;
			try {
				while (true) {
					System.out.println("等待客户端的请求");
					socket = server.accept();
					new Thread(new ClientHandler(socket)).start();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	class ClientHandler implements Runnable {
		Socket socket;
		public ClientHandler() {
		}
		public ClientHandler(Socket socket) {
			this.socket = socket;
		}
		@Override
		public void run() {
			//  \r\n必须是以这两个字符结尾的      ASCll:\r=13    \n=10
			System.out.println("接收客户端请求");
			try {
				InputStream in = socket.getInputStream();//创建输入流
				HttpRequest request = new HttpRequest(in);//request请求将输入流输进去
				System.out.println(request.getMethod());//返回request请求的方法
				System.out.println(request.getUrl());//request请求的路径
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		new WebServer().start();
	}

}

HttpRequest.java

package cn.tedu.v3.http;

import java.io.IOException;
import java.io.InputStream;

public class HttpRequest {
	private String method;
	private String url;
	private String protocol;
	public HttpRequest(InputStream in) throws IOException{
		parseRequestLine(in);
	}
	//进行封装,解析数据第一行
	private void parseRequestLine(InputStream in) throws IOException {
		StringBuilder br=new StringBuilder();
		
		int d=-1;
		char c1=0,c2=0;
		while((d=in.read())!=-1){
			c2=(char)d;
			//解析第一行
			if(c1==13&&c2==10){
				break;
			}
			br.append(c2);
			c1=c2;
			System.out.print((char)d);
		}
		//trim去掉空格的方法
		String str =br.toString().trim();
		String[] data = str.split(" ");//将数据按照" "的方式将其分开,放到数组data里面
		//System.out.println(data[0]);//请求方式
		try {
			this.method=data[0];//需要进行异常处理
			this.url=data[1];
			this.protocol=data[2];
		} catch (Exception e) {
			e.printStackTrace();
		}
		//System.out.println(data[1]);//url请求的资源的名称
		//System.out.println(data[2]);//HTTP的协议名称、版本
		
	}
	public String getMethod() {
		return method;
	}
	public String getUrl() {
		return url;
	}
	public String getProtocol() {
		return protocol;
	}

}

结果:

结果:
等待客户端的请求
等待客户端的请求
等待客户端的请求
接收客户端请求
接收客户端请求
GET /myweb/index.html HTTP/1.1
GET
/myweb/index.html
 

你可能感兴趣的:(JAVASE项目进阶,代码练习,java)