BS通信,服务器代码模拟

来源:互联网 发布:sql 删除重复记录 编辑:程序博客网 时间:2024/05/21 22:56

1.封装通信的Request

package com.dasenlin.testhttp;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.StringTokenizer;/** * 封装Request * @author Administrator * */public class Request {    //解析传递的方法类型    private String method;    //解析来的地址    private String url;    //解析传来的参数    private Map<String,List<String>> parameterMapValues;    public static final String CRLF="\r\n";    private InputStream is;    private String requestInfo;    public Request() {        super();        method ="";        url="";        parameterMapValues=new HashMap<String,List<String>>();    }    public Request(InputStream is){        this();        this.is=is;        byte []data =new byte[20480];        try {            int len =is.read(data);            requestInfo =new String(data,0,len);        } catch (IOException e) {            return;        }        praseRequestInfo();    }    private void praseRequestInfo(){        if(null==requestInfo||(requestInfo=requestInfo.trim()).equals("")){            return;        }        String paramString="";//接收请求参数        String firstLine =requestInfo.substring(0,requestInfo.indexOf(CRLF));        int idx =requestInfo.indexOf("/");        this.method = firstLine.substring(0,idx).trim();        String urlStr =firstLine.substring(idx, firstLine.indexOf("HTTP/")).trim();        if(this.method.equalsIgnoreCase("post")){            this.url=urlStr;            paramString =requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();        }else if(this.method.equalsIgnoreCase("get")){            if(urlStr.contains("?")){                String [] urlArray = urlStr.split("\\?");                this.url =urlArray[0];                paramString = urlArray[1];            }        }else{            this.url=urlStr;        }        //添加参数进入parameterMapValues        if(paramString.equals("")){            return;        }        praseParam(paramString);    }    /**     * 解析参数放进parameterMap     * @param paramString     */    private void praseParam(String paramString){        StringTokenizer token = new StringTokenizer(paramString,"&");        while(token.hasMoreTokens()){            String keyValue = token.nextToken();            String [] keyValues = keyValue.split("=");            if(1==keyValues.length){                keyValues = Arrays.copyOf(keyValues,2);                keyValues[1]=null;            }            String key = keyValues[0].trim();            String value = null==keyValues[1]?null:decode(keyValues[1].trim(),"gbk");             if(!parameterMapValues.containsKey(key)){                parameterMapValues.put(key, new ArrayList<String>());            }            List<String> values = parameterMapValues.get(key);            values.add(value);        }    }    /**     * 根据页面的name获取对应的多个值     * @param name     * @return     */    public String[]getParameterValues(String name){        List<String>values=null;        if(null==(values=parameterMapValues.get(name))){            return null;        }else{            return values.toArray(new String[0]);        }    }    /**     * 根据页面的name获取单个值     * @param name     * @return     */    public String getParameter(String name){        String[] values = getParameterValues(name);        if(null==values){            return null;        }        return values[0];    }    /**     * 解决中文乱码问题     * @param name     * @param value     * @return     */    private String decode(String name,String value){        try {            return java.net.URLDecoder.decode(name,value);        } catch (UnsupportedEncodingException e) {        }        return null;    }}

2.封装通信的Response

package com.dasenlin.testhttp;import java.io.BufferedWriter;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.Socket;import java.util.Date;/** * 封装服务器通信的Reaponse * @author Administrator * */public class Response {    //换行常量    public static final String CRLF = "\r\n";    //结尾常量    public static final String BLANK = " ";    //响应的头部信息    private StringBuilder headInfo;    //构建正文    private StringBuilder content;    //存储正文长度    private int len=0;    //实例化变量    private BufferedWriter bw;    public Response(){        headInfo = new StringBuilder();        content = new StringBuilder();        len=0;    }    public Response(OutputStream os){        this();        bw =new BufferedWriter(new OutputStreamWriter(os,"gbk"));    }    public Response(Socket client){        this();        try {            bw =new BufferedWriter(new OutputStreamWriter(client.getOutputStream(),"gbk"));        } catch (IOException e) {            headInfo=null;        }    }    //构建响应头    private void createHeadInfo(int code){        headInfo.append("HTTP/1.1").append(BLANK).append(code).append(BLANK);        switch(code){           case 200:               headInfo.append("OK");               break;           case 404:               headInfo.append("NOT FOUND");               break;           case 500:               headInfo.append("SERVER ERROR");               break;        }        headInfo.append(CRLF);        headInfo.append("Server:dslin Server/0.0.1").append(CRLF);        headInfo.append("Date:").append(new Date()).append(CRLF);        headInfo.append("Content-type:text/html;chartset=GBK").append(CRLF);        headInfo.append("Content-Length").append(len).append(CRLF);        headInfo.append(CRLF);    }    //构建正文1    public Response print(String info){        content.append(info);        len+=info.getBytes().length;        return this;    }    //构建正文2    public Response println(String info){        content.append(info).append(CRLF);        len+=(info+CRLF).getBytes().length;        return this;    }    //输出    public void pushToClient(int code) throws IOException{        if(null==headInfo){            code = 500;        }        createHeadInfo(code);        bw.append(headInfo.toString());        bw.append(content.toString());        bw.flush();        bw.close();    }    //关闭流    public void close(){        IOUtil.ioclose(bw);    }}

3.服务器类

package com.dasenlin.testhttp;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * 创建服务器并启动,响应 * @author Administrator * */public class Server {    private ServerSocket server;    public static final String CRLF="\r\n";    public static final String BLANK=" ";    /**     * 启动服务器     */    public static void main(String[] args) {        Server serv = new Server();        serv.start();    }    /**     * 启动方法     */    public void start(){        try {            server =new ServerSocket(8888);            this.recieve();        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 接收客户端     */    public void recieve(){        try {            Socket client = server.accept();            Request req =new Request(client.getInputStream());//封装了的请求            Response rep =new Response(client.getOutputStream());//封装了响应                    rep.println("<html><head><title>测试</title>");                    rep.println("</head><body>");                    rep.println("欢迎:").println(req.getParameter("username")).println("回来");                    rep.print("</body></html>");                    rep.pushToClient(200);        } catch (IOException e) {            e.printStackTrace();        }     }}

4.前端页面代码

<html>    <head>        <title>测试服务器响应</title>    </head>    <body>        <form method="post" action="http://localhost:8888">            USERNAME:<input type="text" name="username"/><br/>            PASSWORD:<input type="password" name="password" />            INTRESTING:足球<input type="checkbox" value="足球" name="faverate"/>            蓝球<input type="checkbox" value="蓝球" name="faverate"/>            收球<input type="checkbox" value="收球" name="faverate"/>            搞球<input type="checkbox" value="搞球" name="faverate"/>            <input type="submit" value="提交"/>        </form>    </body></html>
0 0
原创粉丝点击