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]
}
}