import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Date;
/**
* 封装响应信息
*/
public class Response {
public static final String CRLF = "\r\n";
public static final String BLANK = " ";
private BufferedWriter bw;
private StringBuilder content;
private StringBuilder headInfo;
private int len = 0;
public Response(){
headInfo = new StringBuilder();
content = new StringBuilder();
len = 0;
}
public Response(OutputStream os){
this();
bw = new BufferedWriter(new OutputStreamWriter(os));
}
public Response(Socket client){
this();
try {
bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
} catch (IOException e) {
headInfo = null;
}
}
/**
* 构建正文
*/
public Response print(String info){
content.append(info);
len += (info + CRLF).getBytes().length;
return this;
}
/**
* 构建正文+回车
*/
public Response println(String info){
content.append(info).append(CRLF);
len += (info + CRLF).getBytes().length;
return this;
}
/**
* 构建响应头
*/
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:test Server/0.0.1").append(CRLF);
headInfo.append("Date:").append(new Date()).append(CRLF);
headInfo.append("Content-type:text/html;charset=GBK").append(CRLF);
headInfo.append("Content-type:").append(len).append(CRLF);
headInfo.append(CRLF);
}
/**
* 推送到客户端
* @throws IOException
*/
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();
}
}
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;
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(){
method = "";
url = "";
parameterMapValues = new HashMap<String,List<String>>();
requestInfo = "";
}
public Request(InputStream is){
this();
this.is = is;
try {
byte[] data = new byte[204800];
int len = is.read(data);
requestInfo = new String(data,0,len);
} catch (IOException e) {
return;
}
parseRequestInfo();
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
/**
* 分析请求信息
*/
private void parseRequestInfo(){
if((null==requestInfo) || (requestInfo=requestInfo.trim()).equals("")){
return;
}
/**
* ====================================
* 从信息的首行分解出:请求方式 请求路径 请求参数(get可能存在)
* 如:GET /index.html?uname=intputUname&pwd=inputPassword HTTP/1.1
*
* 如果为post方式,请求参数可能在最后正文中
* ====================================
*/
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;
}
}
parseParams(paramString);
}
/**
* 将请求参数封装到Map中
* @param paramString
*/
private void parseParams(String paramString){
StringTokenizer token = new StringTokenizer(paramString,"&");
while(token.hasMoreTokens()){
String keyValue = token.nextToken();
String[] keyValues = keyValue.split("=");
if(keyValues.length == 1){
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);
}
}
/**
* 解决中文
* @param value
* @param code
* @return
*/
private String decode(String value,String code){
try {
return java.net.URLDecoder.decode(value, code);
} catch (UnsupportedEncodingException e) {
}
return null;
}
/**
* 根据页面的name获取对应的多个值
*/
public String[] getParameterValues(String name){
List<String> values = null;
if( (values=parameterMapValues.get(name))==null ){
return null;
}else{
return values.toArray(new String[0]);
}
}
/**
* 根据页面的name获取对应的单个值
*/
public String getParameterValue(String name){
String[] values = getParameterValues(name);
if(null==values){
return null;
}
return values[0];
}
}
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class CopyOfMyServer {
private ServerSocket server ;
private static final String CRLF = "\r\n";
private static final String blank = " ";
public static void main(String[] args) {
new CopyOfMyServer().start();
}
public void start(){
try {
server = new ServerSocket(10001);
receive();
} catch (IOException e) {
e.printStackTrace();
}
}
public void receive(){
try {
Socket soc = server.accept();
Request1 req = new Request1(soc);
req.request();
Response1 re = new Response1(soc);
re.println("<html><head><title>HTML响应实例</title>");
re.println("</head><body>");
re.println("欢迎").println(req.getParaValue("uname"));
re.println("</body></html>");
re.pushToClient(200);
} catch (IOException e) {
e.printStackTrace();
}
}
public void stop(){
}
}