服务器模拟

在浏览器输入url会找到对应的ip地址和端口号来发送请求。

1.新建一个java工程。

新建一个类Tom,有程序入口main方法。是开启服务的一个类。

写一个start()方法

    //创建服务器监听
    public void start(int port){
        try {
            if(serverSocket == null){
            serverSocket = new ServerSocket(PORT);    //定义监听端口
            }
            ExecutorService pool = Executors.newFixedThreadPool(100);  //创建线程池,容量为100
            while(true){
                socket = serverSocket.accept();                         //就收到请求
                System.out.println("有新的请求" + socket.toString());      
                pool.submit(new MySocketHandler(socket));               //收到一个请求,通过传递socket 分配一个线程管理.
            }        
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

2.每收到一个请求就分配一个线程管理。那么线程怎么管理呢?

新建一个MySocketHandler类,该类继承Runnable。写一个该类的构造器,用于与关联请求我们用Socket作为参数传递。

    public MySocketHandler(Socket socket) {           //Socket对象作为传入参数,与请求关联。
        // TODO Auto-generated constructor stub
        try {
            inputStream = socket.getInputStream();      //获得socket连接的输入流
            outputStream = socket.getOutputStream();    //获得socket连接的输出流
            out = new PrintStream(outputStream);        //http协议的标准输出流。socket的输出流进行包装,以便更好输出响应给浏览器
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

3.获得了请求,即socket连接的输入流。我们就对这条请求的内容进行解析,请求些什么东西。

    public String parseRequest(InputStream inputStream) {
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);   
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String[] strings = null;
        try {
            String readLine = bufferedReader.readLine();   //读取第一行,  GET /psbCA2NQZW5.jpg HTTP/1.1 
            
            strings = readLine.split(" ");                 //对第一行的数据选择分割,得到用户请求要访问的文件
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (strings[1].equals(File.separator)) {
            return "psbCA2NQZW5.jpg";
        }else {
            return strings[1];
        }
    }
    

 

4.给定请求访问的文件的路径:

public static final String PATH="E:" + File.separator + "games" + File.separator; //定义文件的路径


public void getFile(String fileName) throws IOException{
        File file = new File(PATH + fileName);             //通过路径名和文件名来引用
        System.out.println(file);
        if (!file.exists()) {                              
            System.out.println("您请求的文件不存在");
            out.println("HTTP/1.1 404 NOT FOUND");
        }else{
            try {
                FileInputStream fileInputStream = new FileInputStream(file);      //文件输入流读到工程中
                @SuppressWarnings("resource")
                BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); //转为Buffer输入流
                byte[] bytes = new byte[(int) file.length()];                                       
                bufferedInputStream.read(bytes);                     //读到字节数组中
                out.println("HTTP/1.1 200 OK");                      //http标准输出流输出响应到浏览器,  200代表响应成功
                out.println();
                out.write(bytes);                                    //输出流给请求的文件
                out.flush();                                         
                out.close();
                
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

 

posted @ 2017-08-09 20:39  halo-漾  阅读(255)  评论(0编辑  收藏  举报