public class ServerRunnable implements Runnable {
//定义Socket对象,用于在构造方法中接受对应的Socket对象
private Socket socket;
public ServerRunnable(Socket socket){
this.socket=socket;
}
//重写该线程执行目标的run方法
@Override
public void run() {
try{
//客户端输入字节流包装为字符输入流,方便读取客户端请求消息
BufferedReader bfr = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//读取客户端请求消息头,包括请求方式 协议版本 请求路径
String line = bfr.readLine();
//按照1-N个空格方式切割请求消息头,直接获取请求路径
String[] str = line.split(" +");
//数组索引1是请求路径, 调用substring去掉路径开始的 斜杠(/)
String path = str[1].substring(1);
//将客户端请求的路径封装为服务器端的File对象
File file = new File(path);
//字节流读取客户端请求的服务器端的文件
FileInputStream fis = new FileInputStream(file);
//获取Socket输出流,用于为客户端响应
OutputStream out = socket.getOutputStream();
//输出http响应头,否则有些浏览器会将html解析为普通文本,没有网页的效果了
out.write("HTTP/1.1 200 OK\r\n".getBytes());
out.write("Server: Apache-Tomcat\r\n".getBytes());
out.write(("Date: "+new Date().toString()+"\r\n").getBytes());
//输出消息头和html正文之间的空行
out.write("\r\n".getBytes());
//请求的html文件,响应给客户端浏览器
byte[] bytes = new byte[1024];
int len = 0 ;
while((len = fis.read(bytes))!=-1){
out.write(bytes, 0, len);
}
socket.close();
} catch (Exception ex){
ex.printStackTrace();
}
}
}
完成服务器端代码
public class WebServer {
public static void main(String[] args) throws Exception{
//创建线程池提供线程
ExecutorService threadPool = Executors.newFixedThreadPool(50);
//创建ServerSocket服务,监听8080端口
ServerSocket server = new ServerSocket(8080);
while(true){
//获取客户端连接
Socket s = server.accept();
//分配线程提交任务执行
threadPool.submit(new ServerRunnable(s));
}
}
}
|