模擬BS服務器案例
模擬B\S服務器(擴展知識點)
模擬網站服務器,使用瀏覽器訪問自己編寫的服務端程序,查看網頁效果。
客戶端:
瀏覽器(127.0.0.1:8080/src/web/index.html)
服務器端:
ServerSocket
文件結構:
獲取index.html的絕對路徑:
E:\Java_code\src\web\index.html
獲取index.html的相對路徑:
web/index.html
ServerSocket服務器代碼:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class BServerSocketDemo {
public static void main(String[] args) throws IOException {
//創建ServerSocket服務器
ServerSocket server = new ServerSocket(8080);
while(true){
//獲取請求連接的Socket客戶端
Socket socket = server.accept();
new Thread(new Runnable() {
@Override
public void run() {
try{
//獲取網絡字節輸入流InputStream
InputStream is = socket.getInputStream();
//使用網絡字節輸入流InputStream中的read(),讀取客戶端訪問的文件信息
/* byte[] bytes = new byte[1024];
int len = 0;
while((len = is.read(bytes)) != -1){
System.out.println(new String(bytes, 0, len));
}*/
// 將網絡網絡字節輸入流InputStream轉換爲字節緩衝輸入流BufferedReader
// 使用字節緩衝輸入流BufferedInputStream中的方法讀取請求的第一行信息,獲取請求文件地址
BufferedReader bufReader = new BufferedReader(new InputStreamReader(is));
String response = bufReader.readLine();
System.out.println(response);
String[] str = response.split(" ");
String htmlPath = str[1].substring(1);
System.out.println(htmlPath);
// 創建本地字節輸入流FileInputStream,在構造方法中傳入請求文件地址
FileInputStream fis = new FileInputStream(htmlPath);
// 相對路徑 src/web/index.html 絕對路徑 E:\Java_code\src\web\index.html
// 使用Socket對象的網絡字節輸出流OutputStream中的write(),將內容回寫到瀏覽器客戶端
OutputStream os = socket.getOutputStream();
// 固定http協議
// 寫入HTTP協議響應頭,固定寫法
os.write("HTTP/1.1 200 OK\r\n".getBytes());
os.write("Content-Type:text/html\r\n".getBytes());
// 必須要寫入空行,否則瀏覽器不解析
os.write("\r\n".getBytes());
// 使用本地字節輸入流中的方法read(),讀取服務器硬盤中的文件內容
byte[] bytes = new byte[1024];
int len = 0;
while((len = fis.read(bytes)) != -1){
os.write(bytes, 0, len);
}
fis.close();
// bufReader.close();
socket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}).start();
}
// server.close();
}
}
1.在瀏覽器中訪問服務器內容:
http://127.0.0.1:8080/web/index.html (出錯)
出錯內容:
java.io.FileNotFoundException: web\index.html (系統找不到指定的路徑。)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:213)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:155)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:110)
at BServerSocketDemo$1.run(BServerSocketDemo.java:37)
at java.base/java.lang.Thread.run(Thread.java:835)
2.在瀏覽器中訪問服務器內容:
http://127.0.0.1:8080/e:/Java_code/src/web/index.html(絕對路徑訪問)
運行結果:
"C:\Program Files\Java\jdk-12.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.1\lib\idea_rt.jar=9903:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.1\bin" -Dfile.encoding=UTF-8 -classpath E:\Java_code\out\production\Java_code BServerSocketDemo
GET /e:/Java_code/src/web/index.html HTTP/1.1
e:/Java_code/src/web/index.html
GET /e:/Java_code/src/web/img/logo2.png HTTP/1.1
e:/Java_code/src/web/img/logo2.png
GET /e:/Java_code/src/web/img/header.jpg HTTP/1.1
e:/Java_code/src/web/img/header.jpg
GET /e:/Java_code/src/web/img/title2.jpg HTTP/1.1
e:/Java_code/src/web/img/title2.jpg
GET /e:/Java_code/src/web/img/1.jpg HTTP/1.1
e:/Java_code/src/web/img/1.jpg
GET /e:/Java_code/src/web/img/big01.jpg HTTP/1.1
e:/Java_code/src/web/img/big01.jpg
GET /e:/Java_code/src/web/img/middle01.jpg HTTP/1.1
e:/Java_code/src/web/img/middle01.jpg
GET /e:/Java_code/src/web/img/small03.jpg HTTP/1.1
e:/Java_code/src/web/img/small03.jpg
GET /e:/Java_code/src/web/img/ad.jpg HTTP/1.1
e:/Java_code/src/web/img/ad.jpg
GET /e:/Java_code/src/web/img/footer.jpg HTTP/1.1
e:/Java_code/src/web/img/footer.jpg
3.在瀏覽器中訪問服務器內容:
http://127.0.0.1:8080/src/web/index.html(相對路徑訪問)
特別注意:
這裏的相對路徑不是web/index.html
運行結果:
GET /src/web/index.html HTTP/1.1
src/web/index.html
GET /src/web/img/logo2.png HTTP/1.1
src/web/img/logo2.png
GET /src/web/img/header.jpg HTTP/1.1
src/web/img/header.jpg
GET /src/web/img/1.jpg HTTP/1.1
src/web/img/1.jpg
GET /src/web/img/title2.jpg HTTP/1.1
src/web/img/title2.jpg
GET /src/web/img/big01.jpg HTTP/1.1
src/web/img/big01.jpg
GET /src/web/img/middle01.jpg HTTP/1.1
src/web/img/middle01.jpg
GET /src/web/img/small03.jpg HTTP/1.1
src/web/img/small03.jpg
GET /src/web/img/ad.jpg HTTP/1.1
src/web/img/ad.jpg
GET /src/web/img/footer.jpg HTTP/1.1
src/web/img/footer.jpg
擴展:
IntelliJ IDEA 文件的相對路徑設置:
run --> edit configurations --> working directory裏面修改爲你原始相對路徑的根目錄就好,也可以將你的相對路徑修改爲 /src+/原始相對路徑。
如果使用相對路徑,默認的是src目錄開始。