01-简单编写http服务器

package com.day3;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Server {

    /**刘诗华
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        //换行符
        String CRLF="\r\n";
        
        //绑定本机8080端口
        ServerSocket server=new ServerSocket(8080);
        //开始接受服务器
        Socket socket = server.accept();
        //获取输入流
        InputStream in = socket.getInputStream();
        //用于接受浏览器的Request请求报文内容
        byte[] buffer=new byte[20480];
        
        int len = in.read(buffer);
        //将字节数组转换成字符串对象
        String s = new String(buffer);
        
        //获取http请求方式
        int endIndex=s.indexOf(CRLF);
        String firstTr=s.substring(0, endIndex); // 第一行 GET /default.jsp?userid=100&pwd=123456 HTTP/1.1
        endIndex=firstTr.indexOf("/");           // 从第一行中获取第一个 /线
        String method=firstTr.substring(0, endIndex).trim();
        
        //获取请求url地址
        int beginIndex=endIndex+1;                 // 从第一个 /线位置
        endIndex=firstTr.indexOf("HTTP");          // 第一行的 HTTP位置
        String url=firstTr.substring(beginIndex, endIndex);
        
        //请求参数字符串
        StringBuilder paramString=new StringBuilder();
        
        //如果浏览器是GET方式请求
        if(method.equalsIgnoreCase("get"))
        {
            //判断是否有带参数,如果有,则做截取,存放于变量paramString字符串当中
            if(firstTr.contains("?"))
            {
                int i=firstTr.indexOf("?")+1;
                paramString.append(firstTr.substring(i, endIndex));
            }
        }
        
        //如果是POST请求,则请求参数的位置是最后一个换行符的位置开始到报文的最后
        if(method.equalsIgnoreCase("post"))
        {
            int lastIndex=s.lastIndexOf(CRLF);
             paramString.append(s.substring(lastIndex));
        }
        
        //定义一个Map集合用于存储请求参数  键:String  值:List 
        //因为我们在前端写表单的时候,可能会有多个 name一样
        //这里我们就要采用一个ArrayList单列集合来存放数据   如  fav=1&fav=2&fav=3
        Map<String, List<String>> parameterMap=new HashMap<String, List<String>>();
        
        //以&符号进行切割请求参数,得到一个字符串数组对象
        String[] keyValues = paramString.toString().split("&");
        
        //关闭资源
        in.close();
        socket.close();
        server.close();
        
        
        //遍历请求参数数组
        for (String attr : keyValues) {
            //以=符做为切割符
            String[] arr = attr.split("=");
            //
            String key=arr[0].trim();
            //
            String value=arr[1].trim();
            
            //假设Map集合当中没有key的数据,则添加一个
            if(!parameterMap.containsKey(key))
            {
                List<String> list=new ArrayList<String>();
                parameterMap.put(key, list);
            }
            //通过key获取list对象
            List<String> list = parameterMap.get(key);
            //将内容值存放于ArrayList数组
            list.add(value);
        }
        
        System.out.println("员工姓名:"+parameterMap.get("uname"));
        System.out.println("手机号码:"+parameterMap.get("tel"));
        System.out.println("个人爱好:"+parameterMap.get("fav"));
        System.out.println("提交按键:"+parameterMap.get("but"));
        
        // 打印结果
        // 员工姓名:[lsh]
        // 手机号码:[15390725037]
        // 个人爱好:[1, 3]
        // 提交按键:[ok]

    }

}

猜你喜欢

转载自www.cnblogs.com/hua900822/p/9807832.html