模拟浏览器访问服务器,使服务器一直处于监听状态

模拟BS服务器分析


  • 客户端:浏览器
  • 服务器:自己创建一个

创建BS版本的TCP服务器


  • 使用浏览器,在地址栏输入服务器IP地址,端口号,文件夹名称,进行访问

  • 打印看看,浏览器请求的是什么东西

package cn.learn.web;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class BroswerServer {
    public static void main(String[] args) throws IOException {
        //创建一个服务器ServerSocket,并在构造方法中指定系统的端口号
        ServerSocket server = new ServerSocket(8080);
        //使用accept方法获取到请求的客户端对象(浏览器)
        Socket bsSocket = server.accept();
        //使用Socket中的方法getInputStream(),获取网络字节输入流
        InputStream serIn = bsSocket.getInputStream();
        //使用read()方法,读取客户端请求信息
        byte[] bytes =new byte[1024];
        int len = 0;
        while((len = serIn.read(bytes)) != -1){
            //控制台看看
            System.out.println(new String(bytes,0,len));
        }
    }
}


B/S


  • 获取请求的页面地址,读取服务器的文件,并返回给客户端,如客户端请求的页面有图片,那么浏览器就会单独的开启一个线程,读取服务器的图片,我们就必须得让服务器一直处于监听状态。
package cn.learn.web;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class BroswerServer {
    public static void main(String[] args) throws IOException {
        //创建一个服务器ServerSocket,并在构造方法中指定系统的端口号
        ServerSocket server = new ServerSocket(8080);

        while(true){
            //使用accept方法获取到请求的客户端对象(浏览器)
            Socket bsSocket = server.accept();
            
            //**********开启多线程**************
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {

                        //使用Socket中的方法getInputStream(),获取网络字节输入流
                        InputStream serIn = bsSocket.getInputStream();


                        //把serIN网络字节输入流对象,转换为字符缓冲输入流
                        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(serIn));
                        //把客户端请求的第一行读取出来并提取自己想要的部分
                        String line[] = bufferedReader.readLine().split(" ");
                        //从数组中拿取自己想要的信息,拿到服务器文件存储地址
                        String html = line[1];



                        //使用Socket中的方法getOutPutStream获取网络字节输出流
                        OutputStream returnOut = bsSocket.getOutputStream();

                        //写入HTTP协议响应头(固定写法)
                        returnOut.write("HTTP/1.1 200 OK\r\n".getBytes());
                        returnOut.write("Content-Type:text/html\r\n".getBytes());
                        //必须写入空行,否则浏览器不解析
                        returnOut.write("\r\n".getBytes());

                        //创建一个本地的字节输入流,构造方法绑定html路径,读取服务器文件内容
                        FileInputStream in = new FileInputStream(html);

                        //一读一写复制文件,把服务器读取的html文件给写回浏览器
                        int len = 0;
                        byte[] bytes = new byte[1024];
                        while ((len = in.read(bytes)) != -1){
                            returnOut.write(bytes,0,len);
                        }

                        //释放资源
                        in.close();
                        bsSocket.close();

                    }catch (IOException e){
                        e.getStackTrace();
                    }
                }
            }).start();
        }
//        server.close();
    }
}

posted @ 2019-10-01 20:20  学之初  阅读(561)  评论(2编辑  收藏  举报