java webserver-封装请求协议2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java webserver-封装请求协议2相关的知识,希望对你有一定的参考价值。

Response:

public class Response 
        private BufferedWriter bw;
        //正文
        private StringBuilder content;
        //协议头(状态行与请求头 回车)信息
        private StringBuilder headInfo;
        private int len; //正文的字节数

private final String BLANK =" ";
private final  String CRLF = "\r\n";
private Response() 
        content =new StringBuilder();
        headInfo=new StringBuilder();
        len =0;

public Response(Socket client) 
        this();
        try 
                bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
         catch (IOException e) 
                e.printStackTrace();
                headInfo = null;
        


public Response(OutputStream os) 
        this();
        bw=new BufferedWriter(new OutputStreamWriter(os));

//动态添加内容
public  Response print(String info) 
        content.append(info);
        len+=info.getBytes().length;
        return this;

public  Response println(String info) 
        content.append(info).append(CRLF);
        len+=(info+CRLF).getBytes().length;
        return this;


//推送响应信息
public void pushToBrowser(int code) throws IOException 
        if(null ==headInfo) 
                code = 505;
        
        createHeadInfo(code);
        bw.append(headInfo);
        bw.append(content);
        bw.flush();


//构建头信息
private void createHeadInfo(int code) 
        //1、响应行: HTTP/1.1 200 OK
        headInfo.append("HTTP/1.1").append(BLANK);
        headInfo.append(code).append(BLANK);
        switch(code) 
                case 200:
                        headInfo.append("OK").append(CRLF);
                        break;
                case 404:
                        headInfo.append("NOT FOUND").append(CRLF);
                        break;  
                case 505:
                        headInfo.append("SERVER ERROR").append(CRLF);
                        break;  
        
        //2、响应头(最后一行存在空行):
        headInfo.append("Date:").append(new Date()).append(CRLF);
        headInfo.append("Server:").append("shsxt Server/0.0.1;charset=GBK").append(CRLF);
        headInfo.append("Content-type:text/html").append(CRLF);
        headInfo.append("Content-length:").append(len).append(CRLF);
        headInfo.append(CRLF);      


Request:

public class Request
    //协议信息
    private String requestInfo;
    //请求方式
    private String method; 
    //请求url
    private String url; 
    //请求参数
    private String queryStr;
    private final  String CRLF = "\r\n";
    public Request(Socket client) throws IOException 
        this(client.getInputStream());
    
    public Request(InputStream is)         
        byte[] datas = new byte[1024*1024];
        int len;
        try 
            len = is.read(datas);
            this.requestInfo = new String(datas,0,len);         
         catch (IOException e) 
            e.printStackTrace();
            return ;
        
        //分解字符串
        parseRequestInfo();
    

    private void parseRequestInfo() 
        System.out.println("------分解-------");
        System.out.println("---1、获取请求方式: 开头到第一个/------");
        this.method = this.requestInfo.substring(0, this.requestInfo.indexOf("/")).toLowerCase();
        this.method=this.method.trim();
        System.out.println("---2、获取请求url: 第一个/ 到 HTTP/------");
        System.out.println("---可能包含请求参数? 前面的为url------");
        //1)、获取/的位置
        int startIdx = this.requestInfo.indexOf("/")+1;
        //2)、获取 HTTP/的位置
        int endIdx = this.requestInfo.indexOf("HTTP/");
        //3)、分割字符串
        this.url = this.requestInfo.substring(startIdx, endIdx);        
        //4)、获取?的位置
        int queryIdx =this.url.indexOf("?");    
        if(queryIdx>=0) //表示存在请求参数,考虑在第一个位置的情况
            String[] urlArray = this.url.split("\\?");
            this.url =urlArray[0];
            queryStr =urlArray[1];
        
        System.out.println(this.url);

        System.out.println("---3、获取请求参数:如果Get已经获取,如果是post可能在请求体中------");

        if(method.equals("post")) 
            String qStr =this.requestInfo.substring(this.requestInfo.lastIndexOf(CRLF)).trim();
            System.out.println(qStr+"-->"); 
            if(null==queryStr) 
                queryStr =qStr;
            else  
                queryStr +="&"+qStr;
            
        
        queryStr = null==queryStr?"":queryStr;
        System.out.println(method+"-->"+url+"-->"+queryStr);
    

Server:

public class Server04 
        private ServerSocket serverSocket ;
        public static void main(String[] args) 
                Server04 server = new Server04();
                server.start();
        
        //启动服务
        public void start() 
                try 
                        serverSocket =  new ServerSocket(8888);
                         receive();
                 catch (IOException e) 
                        e.printStackTrace();
                        System.out.println("服务器启动失败....");
                
        
        //接受连接处理
        public void receive() 
                try 
                        Socket client = serverSocket.accept();
                        System.out.println("一个客户端建立了连接....");
                        //获取请求协议

                Request request=new Request(client);

                //关注了内容
                Response response=new Response(client); //创建好了输出流
                response.print("<html>");    //通过输出流输出
                response.print("<head>");
                response.print("<title>");
                response.print("服务器响应成功");
                response.print("</title>");
                response.print("</head>");
                response.print("<body>");
                response.print("shsxt server终于回来了。。。。");
                response.print("</body>");
                response.print("</html>");
                //关注了状态码
                response.pushToBrowser(200);

         catch (IOException e) 
                e.printStackTrace();
                System.out.println("客户端错误");
        

//停止服务
public void stop() 



以上是关于java webserver-封装请求协议2的主要内容,如果未能解决你的问题,请参考以下文章

java webserver-封装响应协议

java webserver-获取请求协议和返回响应协议

2017-9-7 - A - WebServer项目

java webserve-html

java webserver-http协议图

Nginx的重要概念之request