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>