• 网络编程系列【浏览器实现文件访问(B/S)】


    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();
        }
    }

     web文件结构和index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>测试</title>
    </head>
    <body>
    <h1>测试</h1>
    <img src="HH.JPG">
    </body>
    </html>

    测试:

    1.启动服务端代码

    2.打开浏览器,访问localhost:9999/web/index.html,此时可以访问到文字和图片

  • 相关阅读:
    随笔之过账模版
    随笔之转移日记账
    模式窗口的处理方式
    生产领料的问题
    询问对话框,缓存用户设置
    AX2009 连接外部Orcal与SQL区别
    AX2012全新的批处理方式
    AX调用.dll
    AX在query中添加自己的函数
    Java通过代理上传文件到Azure blob
  • 原文地址:https://www.cnblogs.com/hujunwei/p/15953156.html
Copyright © 2020-2023  润新知