简介
- bs是通过浏览器进行访问的
- 每次访问都会开启一个短期的socket用来访问服务器的资源
响应报文的格式
服务端
bs架构中的b是浏览器,不需要我们书写,我们只需要书写服务端即可
服务端
public class Server {
public static void main(String[] args) {
System.out.println("服务启动成功!");
//1. 创建一个ServerSocket对象
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(8888);
//2. 服务端一直处于监听状态,等待客户端的连接
while (true) {
//accept()方法是一个阻塞方法,会一直等待客户端的连接
new ServerReaderThread(serverSocket.accept()).start();
System.out.println("有新的客户端连接上来了!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务端读取线程
public class ServerReaderThread extends Thread {
private Socket socket;
public ServerReaderThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (
OutputStream outputStream = socket.getOutputStream();
// 打印流更容易打印数据
PrintStream printStream = new PrintStream(outputStream);
) {
while (true) {
printStream.println("HTTP/1.1 200 OK");
printStream.println("Content-Type: text/html; charset=utf-8");
// 必须要有空行
printStream.println();
printStream.println("<h1>hello world</h1>");
socket.close(); // 关闭socket
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用线程池优化一下
- 如果有一万个请求,那就有一万个线程,服务器绝壁挂机
- 使用线程池优化一下
服务器端
public class Server {
public static void main(String[] args) {
System.out.println("服务启动成功!");
//1. 创建一个ServerSocket对象
ServerSocket serverSocket = null;
// 创建一个线程池
ThreadPoolExecutor pool = new ThreadPoolExecutor(8 + 1, 8 * 2, 10, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
try {
serverSocket = new ServerSocket(8888);
//2. 服务端一直处于监听状态,等待客户端的连接
while (true) {
//accept()方法是一个阻塞方法,会一直等待客户端的连接
pool.execute(new ServerReaderThread(serverSocket.accept()));
System.out.println("有新的客户端连接上来了!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}