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