zoukankan      html  css  js  c++  java
  • webserver服务器优化0.1

    直接代码:

    package cn.tedu.core;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**ZHEzhe这个类用来读取服务端的程序
     * 1.生命ServerSocket对象
     * 2.在构造函数中完成ServerSocket对象的初始化
     * 3.提供start方法,接收客户端的请求并相应
     * 4.提供main方法,启动服务器
     * */
    public class WebServer {
        //声明serversocket对象,,他是站在服务端的
        private ServerSocket serverSocket;
    
        //生命一个线程池
        private ExecutorService threadPool;
    
        //在构造方法中完成初始化
        public  WebServer() {
            try {
                serverSocket = new ServerSocket(8080);
    
                //初始化线程池对象,创建一个固定数量的线程池,最大数量100
                threadPool = Executors.newFixedThreadPool(100);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //tigongstartfangfa
        public void start(){
            try {
                while (true){
                    //持续接收客户端请求
                    Socket socket = serverSocket.accept();
    
                    //执行线程类
                    threadPool.execute(new ClientHandler(socket));
    
    
                    //向浏览器返回
                    /*组织的数据格式不符合http协议
                    OutputStream outputStream = socket.getOutputStream();
                    outputStream.write("hello".getBytes());
                    outputStream.flush();*/
    
                    //改造输出格式
                    /*PrintWriter 输出字符
                    * PrintStream 输出除了字符还可以图片啥的*/
                    /*PrintStream ps = new PrintStream(socket.getOutputStream());
                    //拼接状态行
                    ps.println("HTTP/1.1 200 OK");
                    //响应头,相应内容:网页类型
                    ps.println("Context-Type:text/html");
                    //相应内容的长度
                    String data = "hello server~";
                    ps.println("Content-Length:"+data.length());
    
                    //空白行
                    ps.println();
    
                    //拼接相应实体内容
                    ps.write(data.getBytes());
                    ps.flush();
                    socket.close();*/
    
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        //提供main方法启动
        public static void main(String[] args) {
            WebServer webServer = new WebServer();
            //接收请求并相应
            webServer.start();
        }
    
    }
    package cn.tedu.core;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Arrays;
    import java.util.Spliterator;
    
    import com.sun.corba.se.impl.orb.ParserTable.TestAcceptor1;
    import com.sun.org.apache.xpath.internal.operations.Bool;
    
    import sun.java2d.pipe.SpanClipRenderer;
    
    
    /**这个类作为一个线程类,抽取sTART 方法的代码*/
    
    public class ClientHandler implements Runnable {
    
        //1声明socket对象4
        private Socket socket;
        //2zao在狗仔函数中传入socket对象,并保存类中
        public ClientHandler(Socket socket){
            //this表示本类对象
            this.socket=socket;
        }
    
        //3重写润方法,抽取start
        @Override
        public void run() {
            //相应代码
            try {
    
                //获取请求行的数据
                //BufferdReader 可以读一行数据,字符流
                //InputStreamReader可以吧字节流转换成字符流
                //            socket.getInputStream()是字节流
                BufferedReader bReader = new BufferedReader(
                        new InputStreamReader(socket.getInputStream()));
                //获取第一行数据
                String readLine = bReader.readLine();
                System.out.println(readLine);
    
                if (readLine!=null) {
                    String[] split = readLine.split(" ");
                    System.out.println(Arrays.toString(split));
                    String url = split[1];
                    if(!url.equals("index.html")||!url.equals("test.html")){
                        url = "index.html";
                    }
                        
    
                    PrintStream ps =
                            new PrintStream(socket.getOutputStream());
                    //保证响应头只许发一次
                    boolean ll = false;
                    if (!ll) {//如果没有发送就发送一次
                        //相应状态
                        ps.println("HTTP/1.1: 200");
                        //xiang相应头
                        ps.println("Context-Type:text/html");
                        String  data = "is ok !!!";
                        File file = new File("WebContent/"+url);
                        ps.println("Content-Length" + file.length());
                        //空白行
                        ps.println();
                        //相应实体内容
                        //            ps.write(data.getBytes());
                        BufferedInputStream bi = 
                                new BufferedInputStream(new FileInputStream(file));
                        byte[] b = new byte[(int) file.length()];
                        bi.read(b);
                        ps.write(b);
                        ps.flush();
                        socket.close();
                        
                        ll=true;
                    }
                    
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
  • 相关阅读:
    ASP.NET中Session,Application,Viewstate,Cache,隐藏域和带参数的传接收值的用法
    JS页面跳转搜集
    SQL中常用的日期转化
    DIV+CSS兼容性解决IE6/IE7/FF浏览器的通用方法
    C#中将数据导出为EXCEL方式汇总
    正则表达式大全
    ASP.NET中Cookie用法小节
    div+CSS浏览器兼容问题整理
    站长常用的200个js代码
    [转]主机和终端
  • 原文地址:https://www.cnblogs.com/gxlaqj/p/11354218.html
Copyright © 2011-2022 走看看