1、之前的客户端都是什么样的
- 其实就是CS架构,客户端是需要我们自己开发实现的
2、BS结构是什么样的,需要开发客户端吗?
- 浏览器访问服务端,不需要开发客户端
注意:服务端必须给浏览器响应HTTP协议格式的数据,否则浏览器不识别
package com.csdn.d10_bs; import java.io.IOException; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class BSserverDemo { public static void main(String[] args) { try { //1.注册端口 ServerSocket ss = new ServerSocket(8080); //2.创建一个循环接收多个客户端的请求 while (true) { Socket socket = ss.accept(); //3.交给一个独立的线程来处理! new ServerReaderThread(socket).start(); } } catch (IOException e) { throw new RuntimeException(e); } } } class ServerReaderThread extends Thread { private Socket socket; public ServerReaderThread(Socket socket) { this.socket = socket; } @Override public void run() { try { //浏览器 已经与本线程建立了Socket管道 //响应消息给浏览器显示 PrintStream ps = new PrintStream(socket.getOutputStream()); //必须响应HTTP协议格式数据,否则浏览器不认识消息 ps.println("HTTP/1.1 200 OK");//协议类型和版本 响应成功的消息! ps.println("Content-Type:text/html;charset=UTF-8"); ps.println();//必须发送一个空行 //才可以响应数据回去给浏览器 ps.println("<span style='color:red;font-size:90px'>CSDN</span>"); ps.close(); } catch (IOException e) { throw new RuntimeException(e); } } }
3、基于线程池BS架构
package com.csdn.d10_bs; import java.io.IOException; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.*; public class BSserverDemo { //使用静态变量记住一个线程池对象 private static ExecutorService pool = new ThreadPoolExecutor(3, 5, 6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); public static void main(String[] args) { try { //1.注册端口 ServerSocket ss = new ServerSocket(8080); //2.创建一个循环接收多个客户端的请求 while (true) { Socket socket = ss.accept(); //3.交给一个独立的线程来处理! pool.execute(new ServerReaderRunnable(socket)); } } catch (IOException e) { throw new RuntimeException(e); } } } class ServerReaderRunnable implements Runnable { private Socket socket; public ServerReaderRunnable(Socket socket) { this.socket = socket; } @Override public void run() { try { //浏览器 已经与本线程建立了Socket管道 //响应消息给浏览器显示 PrintStream ps = new PrintStream(socket.getOutputStream()); //必须响应HTTP协议格式数据,否则浏览器不认识消息 ps.println("HTTP/1.1 200 OK");//协议类型和版本 响应成功的消息! ps.println("Content-Type:text/html;charset=UTF-8"); ps.println();//必须发送一个空行 //才可以响应数据回去给浏览器 ps.println("<span style='color:red;font-size:90px'>CSDN</span>"); ps.close(); } catch (IOException e) { throw new RuntimeException(e); } } }
4、TCP通信如何实现BS请求网页信息回来呢?
- 客户端使用浏览器发起请求(不需要开发客户端)
- 服务端必须按照浏览器的协议规则响应数据
- 浏览器使用什么协议规则呢? 是 HTTP 协议