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终于回来了。。。。"+request.getParameter("uname"));
response.print("</body>");
response.print("</html>");
//关注了状态码
response.pushToBrowser(200);

} catch (IOException e) { e.printStackTrace(); System.out.println("客户端错误"); } } //停止服务 public void stop() {

}

}

Request:

public class Request{
    //协议信息
    private String requestInfo;
    //请求方式
    private String method; 
    //请求url
    private String url; 
    //请求参数
    private String queryStr;
    private final  String CRLF = "\r\n";
    private Map<String,List<String>> parameterMap;
    public Request(Socket client) throws IOException {
        this(client.getInputStream());
    }
    public Request(InputStream is) {    
        parameterMap=new HashMap<String,List<String>>();
        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+"--&gt;"); 
    if(null==queryStr) {
        queryStr =qStr;
    }else { 
        queryStr +="&amp;"+qStr;
    }
}
queryStr = null==queryStr?"":queryStr;
System.out.println(method+"--&gt;"+url+"--&gt;"+queryStr);
//转成Map fav=1&amp;fav=2&amp;uname=shsxt&amp;age=18&amp;others=""
convertMap();

} //处理请求参数为Map private void convertMap() { //分割字符串 String[] keyValues=this.queryStr.split("&"); for(String queryStr:keyValues) { //再次分割字符串按=分 String[] kv=queryStr.split("="); kv=Arrays.copyOf(kv, 2); //拷贝数组kv中的两个元素到kv //获取key和value String key=kv[0]; String value=kv[1]==null?null:decode(kv[1],"utf-8"); //存储到Map if(!parameterMap.containsKey(key))//如果没有,就创建 { parameterMap.put(key,new ArrayList<String>() ); } parameterMap.get(key).add(value); } } //通过name获取对应的多个值 public String[] getParameterValues(String key) { List<String> values=this.parameterMap.get(key); if(null==values||values.size()<1) { return null; } return values.toArray(new String[0]); //将列表转成字符数组 } //通过name获取对应的一个值 public String getParameter(String key) { String[] values= getParameterValues(key);

return values==null?null:values[0];

} //处理中文 private String decode(String value,String enc) { try { return java.net.URLDecoder.decode(value,enc);//第二个参数为字符集 } catch (UnsupportedEncodingException e) {

    e.printStackTrace();
}
return null;

} public String getMethod() { return method; }

public String getUrl() { return url; }

public String getQueryStr() { return queryStr; }

}

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);
}

}