zoukankan      html  css  js  c++  java
  • java服务器简单实现

    一 HTTP
     http请求
     一般一个http请求包括以下三个部分:
     1 请求方法,如get,post
     2 请求头

     
    3 实体
     
    一个http请求的实例如下:
    GET /index.jsp HTTP/1.1
    Host: localhost:8080
    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    注意红色部分的url,这是我们待会要截取出来的。
     http响应
    与http请求类似,http响应也包括三个部分
    1 协议-状态码-描述
    2 响应头
    3 响应实体段

    二 socket类
    套接字是网络连接的断点。套接字使得应用程序可以从网络中读取数据,可以向网络中写入数据。不同计算机上的应用程序可以通过套接字发送或接受字节流。java中提供了Socket类来实现这个功能,通过getInputStream和getOutputStream可以获取网络中的输入输出流。
      但是,光靠Socket类还是不能够实现我们构建一个服务器应用程序的功能的,因为服务器必须时刻待命,因此java里面提供了ServerSocket类来处理等待来自客户端的请求,当ServerSocket接受到了来自客户端的请求之后,它就会创建一个实例来处理与客户端的通信。
     
    三 服务器应用程序的实现
    首先,我们要构建一个封装请求信息的类requst,一个响应请求的类response,还要有一个主程序httpServer来处理客户端来的请求。

    package com.lwq;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * @author Joker
     * 类说明
     * 将浏览器发来的请求信息转化成字符和截取url
     */
    public class Request {
        
        //输入流
        private InputStream input;
        //截取url,如http://localhost:8080/index.html ,截取部分为 /index.html
        private String uri;
        public Request(InputStream inputStream){
            this.input = inputStream;
        }
        
        public InputStream getInput() {
            return input;
        }
        public void setInput(InputStream input) {
            this.input = input;
        }
        public String getUri() {
            return uri;
        }
        public void setUri(String uri) {
            this.uri = uri;
        }
        
        //从套接字中读取字符信息
        public void parse(){
            
                StringBuffer request = new StringBuffer(2048);
                int i = 0;
                byte[] buffer = new byte[2048];
                
                try {
                    i = input.read(buffer);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    i = -1;
                }
                for(int j = 0;j<i;j++){
                        request.append((char)(buffer[j]));
                }
                System.out.println(request.toString());
                uri = parseUri(request.toString());
                }
        //截取请求的url
        private String parseUri(String requestString){
            
            int index1 = 0;
            int index2 = 0;
            index1 = requestString.indexOf(' ');
            if(index1!=-1){
                index2 = requestString.indexOf(' ',index1+1);
                if(index2>index1){
                    return requestString.substring(index1+1,index2);
                }
            }
            
            return null;
        }
                
                
                
            
        }

    下面是封装了响应请求的类response:

    package com.lwq;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    
    /**
     * @author Joker
     * @version 创建时间:Sep 5, 2012 9:59:53 PM
     * 类说明 根据相应信息返回结果
     */
    public class Response {
        
        private static final int BUFFER_SIZE = 1024;
        Request request;
        OutputStream output;
        public Response(OutputStream output){
            this.output = output;
        }
        
        public void sendStaticResource() throws IOException{
            
            byte[] bytes = new byte[BUFFER_SIZE];
            FileInputStream fis = null;
            
            File file = new File(HttpServer.WEB_ROOT,request.getUri());
            if(file.exists()){
                try {
                    fis = new FileInputStream(file);
                    int ch = fis.read(bytes,0,BUFFER_SIZE);
                    while(ch != -1){
                        output.write(bytes,0,ch);
                        ch = fis.read(bytes,0,BUFFER_SIZE);
                    }
                    
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }catch(IOException e){
                    e.printStackTrace();
                }finally{
                    if(fis !=null){
                        fis.close();
                    }
                }
                
            }else{
                //找不到文件
                 String errorMessage = "HTTP/1.1 404 File Not Found
    " +
         "Content-Type: text/html
    " +
         "Content-Length: 23
    " +
         "
    " +
         "
    File Not Found
    ";
                 try {
                    output.write(errorMessage.getBytes());
                    output.flush();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        public Request getRequest() {
            return request;
        }
        public void setRequest(Request request) {
            this.request = request;
        }
        public OutputStream getOutput() {
            return output;
        }
        public void setOutput(OutputStream output) {
            this.output = output;
        }
        public static int getBUFFER_SIZE() {
            return BUFFER_SIZE;
        }
        
        
    
    }

    接下来是主程序,

    package com.lwq;
    
    import java.io.File;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * @author Joker
     * 类说明
     */
    public class HttpServer {
    
        /**
         * @param args
         */
        
        //WEB_ROOT是服务器的根目录
        public static final String WEB_ROOT = System.getProperty("user.dir")+File.separator+"webroot";
        
        //关闭的命令
        private static final String SHUTDOWN_COMMAND= "/SHUTDOWN";
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            HttpServer server = new HttpServer();
            server.await();
    
        }
        public void await(){
            ServerSocket serverSocket = null;
            int port = 8080;
            try {
                serverSocket = new ServerSocket(port,1,InetAddress.getByName("127.0.0.1"));
                while(true)
                {
                    try {
                Socket socket = null;
                InputStream input = null;
                OutputStream output = null;
                socket = serverSocket.accept();
                input = socket.getInputStream();
                output = socket.getOutputStream();
                //封装request请求
                Request request = new Request(input);
                request.parse();
                //封装response对象
                Response response = new Response(output);
                response.setRequest(request);
                response.sendStaticResource();
                socket.close();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        continue;
                    }
                
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
            
        }
        
    
    }

    运行httpServer,在浏览器中打下http://localhost:8080/index.jsp,就能看到服务器响应的结果了。

  • 相关阅读:
    Boost智能指针使用总结
    C++细节理解
    Mysql导入导出
    Mysql Join语法以及性能优化
    数据库设计三大范式
    Mysql子查询
    js面向对象的实现(example 一)
    js对象常用2中构造方法
    RequireJS 加载 easyui
    Cordova 打包 Android release app 过程详解
  • 原文地址:https://www.cnblogs.com/jokerjason/p/5838569.html
Copyright © 2011-2022 走看看