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


    模拟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
    ".getBytes());
                            returnOut.write("Content-Type:text/html
    ".getBytes());
                            //必须写入空行,否则浏览器不解析
                            returnOut.write("
    ".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();
        }
    }
    
    
  • 相关阅读:
    【Socket】linux无连接编程技术
    【Socket】linux套接字技术之tcp
    【线程】linux之多线程同步互斥技术
    【线程】linux之thread错误解决方案
    【消息】linux之消息队列
    【Mysql】linux连接mysql错误解决方案
    【Mysql】Fedora下 Mysql 安装及配置
    hdu2457
    hnu10104
    hdu4117
  • 原文地址:https://www.cnblogs.com/huxiaobai/p/11616053.html
Copyright © 2020-2023  润新知