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;}@Overridepublic 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;}@Overridepublic 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 协议