模拟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.(FileInputStream.java:155)
at java.base/java.io.FileInputStream.(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目录开始。