[Java] 模拟 B\S 服务器


模拟 B\S 服务器

  • 模拟网站服务器,使用浏览器访问自己编写的服务端程序,查看网页效果。

1. 案例分析

  1. 准备页面数据,web 文件夹;
  2. 我们模拟服务器端,ServerSocket 类监听端口,使用浏览器访问,查看网页效果。

2. 案例实现

  • 浏览器工作原理是遇到图片会开启一个线程进行单独的访问,因此在服务器端加入线程技术。
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8888);
        while (true) {
            Socket socket = server.accept();
            new Thread(new Web(socket)).start();
        }
    }
}

class Web implements Runnable {
    private Socket socket;

    public Web(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        try {
            //转换流,读取浏览器请求第一行
            BufferedReader readWb = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String requst = readWb.readLine();
            //取出请求资源的路径
            String[] strArr = requst.split(" ");
            System.out.println(Arrays.toString(strArr));
            String path = strArr[1].substring(1);
            System.out.println(path);

            FileInputStream fis = new FileInputStream(path);
            System.out.println(fis);
            byte[] bytes = new byte[1024];
            int len = 0;

            //向浏览器 回写数据
            OutputStream out = socket.getOutputStream();
            out.write("HTTP/1.1 200 OK\r\n".getBytes());
            out.write("Content-Type:text/html\r\n".getBytes());
            out.write("\r\n".getBytes());
            while ((len = fis.read(bytes)) != -1) {
                out.write(bytes, 0, len);
            }
            fis.close();
            out.close();
            readWb.close();
            socket.close();
        } catch (Exception ex) {

        }
    }
}

3. 效果展示

  • Console:www.index.html。访问效果:
    在这里插入图片描述

原文链接:https://qwert.blog.csdn.net/article/details/105356269

发布了369 篇原创文章 · 获赞 381 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Regino/article/details/105356269