測試步驟:
- 執(zhí)行
HttpServerMain.java
- 瀏覽器訪問
http://127.0.0.1:8181/test.html
SimpleHttpServer.java
該類定義了對端口的監(jiān)聽描融,對每一個(gè)請求的具體處理拦盹,和開啟服務(wù)器宇挫。
package com.httpServerTest;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import com.threadpooltest.DefaultThreadPool;
import com.threadpooltest.ThreadPool;
public class SimpleHttpServer {
//處理HttpRequest的線程池
static ThreadPool<HttpRequestHandler> threadPool = new DefaultThreadPool<HttpRequestHandler>(1);
static String basePath;
static ServerSocket serverSocket;
//服務(wù)監(jiān)聽端口
static int port = 8181;
public static void setPort(int port){
if(port>0){
SimpleHttpServer.port = port;
}
}
public static void setBasePath(String basePath){
if(basePath != null && new File(basePath).exists() && new File(basePath).isDirectory()){
SimpleHttpServer.basePath = basePath;
}
}
//啟動(dòng)SimpleHttpServer
public static void start() throws Exception{
serverSocket = new ServerSocket(port);
Socket socket = null;
while((socket=serverSocket.accept()) != null){
//接收一個(gè)客戶端Socket件豌,生成一個(gè)HttpRequestHandler袱蚓,放入線程池中執(zhí)行
threadPool.execute(new HttpRequestHandler(socket));
}
serverSocket.close();
}
static class HttpRequestHandler implements Runnable{
private Socket socket;
public HttpRequestHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
String line = null;
BufferedReader br = null;
BufferedReader reader = null;//讀socket的輸入
PrintWriter out = null;//讀socket的輸出
InputStream in = null;//讀圖片文件
try{
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String header = reader.readLine();
System.out.println("收到header=" + header);
//由相對路徑計(jì)算出絕對路徑
String filePath = basePath + header.split(" ")[1];
out = new PrintWriter(socket.getOutputStream());
if(! new File(filePath).exists()){
out.flush();
return;
}
//如果有請求資源的后綴是.jpg或者.ico,則讀取資源并輸出
if(filePath.endsWith(".jpg")){
in = new FileInputStream(filePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i = 0;
while((i = in.read()) != -1){
baos.write(i);
}
byte[] array = baos.toByteArray();
out.println("HTTP/1.1 200 OK");
out.println("Server: Molly");
out.println("Content-Type:image/jpeg");
out.println("Content-Length:" + array.length);
out.println("");
socket.getOutputStream().write(array, 0, array.length);
}else{
br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
out.println("HTTP/1.1 200 OK");
out.println("Server: Molly");
out.println("Content-Type:text/html;charset=UTF-8");
out.println("");
while((line = br.readLine()) != null){
out.println(line);
}
}
out.flush();
}catch(Exception e){
e.printStackTrace();
out.println("HTTP/1.1 500");
out.println("");
out.flush();
}finally{
close(br, in, reader, out, socket);
}
}
//關(guān)閉流或者socket
private static void close(Closeable... closeables){
if(closeables != null){
for(Closeable closeable : closeables){
try {
if(closeable!=null){
closeable.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
HttpServerMain.java
package com.httpServerTest;
public class HttpServerMain {
public static void main(String[] args) {
SimpleHttpServer shs = new SimpleHttpServer();
shs.setBasePath("D:/testDir"); //將根目錄定義到html所在的目錄
try {
shs.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
一個(gè)簡易的html頁面test.html
將該頁面和任意三個(gè)命名為1.jpg/2.jpg/3.jpg的圖片放到d:\testDir文件夾芥吟。
<html>
<head>
<title>測試頁面</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body align="center">
<h1>第一張圖片</h1>
<img src="1.jpg" alt="" align="middle"/>
<h1>第二張圖片</h1>
<img src="2.jpg" alt="" align="middle"/>
<h1>第三張圖片</h1>
<img src="3.jpg" alt="" align="middle"/>
</body>
</html>