用花生壳做好了外网访问链接
coldcoding.picp.net:27227
服务器核心代码两百行左右
非阻塞IO的方式解析浏览器请求,封装为请求报文类
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
//由请求产生的Socket读取请求报文并解析成为Request
public class Request {
private String method; //请求方法
private String version; //协议版本
private String requestURL; //
private String requestURI; //请求的URI地址 在HTTP请求的第一行的请求方法后面
private String host; //请求的主机信息
private String connection; //HTTP请求连接状态信息 对应HTTP请求中的Connection
private String agent; //代理,用来标识代理的浏览器信息 ,对应HTTP请求中的User-Agent:
private String language; //对应Accept-Language
private String encoding; //请求的编码方式 对应HTTP请求中的Accept-Encoding
private String charset; //请求的字符编码 对应HTTP请求中的Accept-charset
private String accept; //对应HTTP请求中的Accept;
private int contentLength = 0;
//一个请求可能包含的全部信息
private InputStream reader;
public Request(InputStream reader) throws IOException{
this.reader = reader;
this.getRequest();
}
//空白构造函数,用来自己构造请求消息
public Request(){
}
private void getRequest() throws IOException{
/*解析请求报文,读取出消息体,不对消息体做解析*/
String line = readLine(reader, 0);
parser(line);
do {
line = readLine(reader, 0);
//如果有Content-Length消息头时取出
if (line.startsWith("Content-Length")) {
contentLength = Integer.parseInt(line.split(":")[1].trim());
}
parser(line);
} while (!line.equals("\r\n"));
if ("POST".equalsIgnoreCase(method)) {
/*TODO POST请求的消息体解析*/
System.out.print(readLine(reader, contentLength));
System.out.println();
}
//reader.close();
//client.close();
//HTTP GET请求 Socket发送和接收公用同一个套接字,关闭则视为通信失败
}
/*
Socket InputStream因为HTTP数据流没有结尾会陷入阻塞
*/
private