package com.websever.cor;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket ;
import java.net.Socket;
/**
* 服务器端
* version03 clinthandler 里读取客户端的请求
* 服务器端通过初始化ServerSocket(8080),并accep来等待客户端的连接
* 客户端通过 浏览器 localhost:8080 来连接服务器
* @author zhaxi
*/
public class WebSever {
private ServerSocket socket ;
public WebSever(){
try {
System.out.println("初始化服务器端.....");
//初始化服务器端 端口号
socket = new ServerSocket(8080) ;
System.out.println("已初始化服务器端");
} catch (IOException e) {
e.printStackTrace();
}
}
public void start(){
try {
while(true){
//连接客户端 通过浏览器 localhost:8080连接
System.out.println("等待客户端连接.....");
Socket sock = socket.accept() ;
ClindHandler chandler = new ClindHandler(sock) ;
Thread th = new Thread(chandler) ;
th.start() ;
System.out.println("已连接客户端");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args){
WebSever ws = new WebSever() ;
ws.start() ;
}
/**
* 处理客户端的请求处理
* 由多个客户端请求处理,因此必须要以线程处理 实现线程接口runnable
*/
private class ClindHandler implements Runnable{
//处理客户端的请求 必须要有socket的连接
private Socket socket ;
public ClindHandler(Socket socket){
this.socket = socket ;
}
//必须重写
public void run(){
System.out.println("处理客户端请求!") ;
try {
//读取东西需要输入流读取每一个 请求的字节
InputStream in = socket.getInputStream() ;
//获取 请求的信息 存在StringBuilder里
StringBuilder sb = new StringBuilder() ;
int d = -1 ;
//怎么获取每一行 读取一个字节存到 c1 c2里 进行比对
//请求分为 请求行 消息头 都是以 CRLF结尾的 CR的ACS=13 LF的ACS=10
char c1 = 0 ;
char c2 = 0 ;
//循环读取
while((d = in.read()) != -1){
//读到的存到 c2里
c2 = (char)d ;
//如果 c1 c2的指与 CR的ACS=13 LF的ACS=10 相等就
if(c1 == 13 && c2 == 10){
break ;
}
//每一个读到的存到StringBuilder里
sb.append((char)d) ;
//c2的字节 存在 c1里 方便比较是否读到CRLF
c1 = c2 ;
}
System.out.println(sb.toString().trim());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}