BS通信,服务器代码模拟

8 篇文章 0 订阅

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值