1.B/S结构原理分析
服务端代码
import java.io.*; import java.net.ServerSocket; import java.net.Socket; /* 模拟B\S服务器 客户端: 浏览器 服务器端: ServerSocket 步骤: 1.创建服务器端的ServerSocket对象,指定端口号 2.服务器端ServerSocket对象调用accept方法,获取连接服务器的Socket对象 3.连接服务器的Socket对象调用getInputStream方法,获取服务器端的字节输入流对象 4.通过服务器端的字节输入流对象获取浏览器请求文件路径 5.创建文件字节输入流FileInputStream对象,绑定服务器端的源文件(浏览器请求的文件) 6.连接服务器的Socket对象调用getOutputStream方法,获取服务器端的字节输出流对象 7.循环读(服务器端的目标文件)写(客户端浏览器) 8.关闭资源 因为: 浏览器接收到服务的.html进行解析时,会自动会向服务器发送多次请求,请求其它资源,比如图片 所以服务器端,不能停止 多客户端访问,多线程的 */ public class Server4 { public static void main(String[] args) throws IOException { //1.创建服务器端的ServerSocket对象,指定端口号 ServerSocket server = new ServerSocket(9999); //死循环 while(true) { //2.服务器端ServerSocket对象调用accept方法,获取连接服务器的Socket对象 Socket client = server.accept(); //进来一个客户端,开启一个线程 new Thread(new Runnable() { @Override public void run() { try { //3.连接服务器的Socket对象调用getInputStream方法,获取服务器端的字节输入流对象 InputStream netIs = client.getInputStream(); //4.通过服务器端的字节输入流对象获取浏览器请求文件路径 //字节输入流转换成字符缓冲输入流 BufferedReader br = new BufferedReader(new InputStreamReader(netIs)); //读取第一行 String line = br.readLine(); //System.out.println(line);//GET /day14/web/index.html HTTP/1.1 String path = line.split(" ")[1].substring(1); System.out.println(path);// day14/web/index.html //文件夹中,没有此文件 if(path.contains("favicon.ico")) { return; } //5.创建文件字节输入流FileInputStream对象,绑定服务器端的源文件(浏览器请求的文件) FileInputStream fis = new FileInputStream(path); //6.连接服务器的Socket对象调用getOutputStream方法,获取服务器端的字节输出流对象 OutputStream netOs = client.getOutputStream(); //服务器给浏览器响应.html文件前,必须下发送以下三行内容 netOs.write("HTTP/1.1 200 OK\r\n".getBytes()); netOs.write("Content-Type:text/html\r\n".getBytes()); netOs.write("\r\n".getBytes()); //7.循环读(服务器端的目标文件)写(客户端浏览器) int len = 0; byte[] bs = new byte[1024]; while((len = fis.read(bs))!=-1) { netOs.write(bs,0,len); } //8.关闭资源 br.close(); netOs.close(); client.close(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } //server.close(); } }