java封装request_java webserver-封装request请求协议

封装请求协议:获取method uri以及请求参数

public class Request {

//协议信息

private String requestInfo;

//请求方式

private String method;

//请求的uri

private String url;

//请求的参数

private String queryStr;

public Request(InputStream is)

{

byte[] datas=new byte[1024*1024];

int len = 0;

try {

len=is.read(datas);

this.requestInfo =new String(datas,0,len);

System.out.println(requestInfo);

} catch (IOException e) {

e.printStackTrace();

return;

}

//分解字符串

parseRequestInfo();

}

public Request(Socket client) throws IOException

{

this(client.getInputStream()); //构造器的相互调用,只能放在首行

}

private void parseRequestInfo()

{

System.out.println("----分解----");

//获取请求方式

System.out.println("1、获取请求方式:开头到第一个/之间");

this.method=this.requestInfo.substring(0,this.requestInfo.indexOf("/")).toLowerCase();

//获取url

System.out.println("2、获取url:第一个/到HTTP/第一个字母之间");

System.out.println("---可能包含请求参数?前面的为url");

//url:获取第一个/的位置

int startIdx1=this.requestInfo.indexOf("/")+1; //要/之后的内容

//url:获取HTTP/的第一个字母的位置

int endIdx2=this.requestInfo.indexOf("HTTP/"); //返回第一个字母的位置

//url:分割字符串

this.url=this.requestInfo.substring(startIdx1,endIdx2);

//获取?的位置

int queryIdx=this.url.indexOf("?"); //大于零表示存在

if(queryIdx>0)

{

String[] urlArray=this.url.split("\\?");//必须转义

this.url=urlArray[0];

queryStr=urlArray[1]; //请求参数

}

System.out.println(this.url);

}

}

Server:

public class Server04 {

private ServerSocket serverSocket ;

public static void main(String[] args) {

Server04 server = new Server04();

server.start();

}

//启动服务

public void start() {

try {

serverSocket = new ServerSocket(8888);

receive();

} catch (IOException e) {

e.printStackTrace();

System.out.println("服务器启动失败....");

}

}

//接受连接处理

public void receive() {

try {

Socket client = serverSocket.accept();

System.out.println("一个客户端建立了连接....");

//获取请求协议

Request request=new Request(client);

//关注了内容

Response response=new Response(client); //创建好了输出流

response.print(""); //通过输出流输出

response.print("

");

response.print("

");

response.print("服务器响应成功");

response.print("

");

response.print("");

response.print("

");

response.print("shsxt server终于回来了。。。。");

response.print("");

response.print("");

//关注了状态码

response.pushToBrowser(200);

} catch (IOException e) {

e.printStackTrace();

System.out.println("客户端错误");

}

}

//停止服务

public void stop() {

}

}

Response:

public class Response {

private BufferedWriter bw;

//正文

private StringBuilder content;

//协议头(状态行与请求头 回车)信息

private StringBuilder headInfo;

private int len; //正文的字节数

private final String BLANK =" ";

private final String CRLF = "\r\n";

private Response() {

content =new StringBuilder();

headInfo=new StringBuilder();

len =0;

}

public Response(Socket client) {

this();

try {

bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));

} catch (IOException e) {

e.printStackTrace();

headInfo = null;

}

}

public Response(OutputStream os) {

this();

bw=new BufferedWriter(new OutputStreamWriter(os));

}

//流模式动态添加内容

public Response print(String info) {

content.append(info);

len+=info.getBytes().length;

return this;

}

public Response println(String info) {

content.append(info).append(CRLF);

len+=(info+CRLF).getBytes().length;

return this;

}

//推送响应信息

public void pushToBrowser(int code) throws IOException {

if(null ==headInfo) {

code = 505;

}

createHeadInfo(code);

bw.append(headInfo);

bw.append(content);

bw.flush();

}

//构建头信息

private void createHeadInfo(int code) {

//1、响应行: HTTP/1.1 200 OK

headInfo.append("HTTP/1.1").append(BLANK);

headInfo.append(code).append(BLANK);

switch(code) {

case 200:

headInfo.append("OK").append(CRLF);

break;

case 404:

headInfo.append("NOT FOUND").append(CRLF);

break;

case 505:

headInfo.append("SERVER ERROR").append(CRLF);

break;

}

//2、响应头(最后一行存在空行):

headInfo.append("Date:").append(new Date()).append(CRLF);

headInfo.append("Server:").append("shsxt Server/0.0.1;charset=GBK").append(CRLF);

headInfo.append("Content-type:text/html").append(CRLF);

headInfo.append("Content-length:").append(len).append(CRLF);

headInfo.append(CRLF);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值