webserver服务器优化

直接代码:

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/: 200 OK");
                    //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();
        }

    }
}

猜你喜欢

转载自www.cnblogs.com/gxlaqj/p/11354218.html