手写服务器httpserver_封装Response_封装Request_JAVA199-201
来源:互联网 发布:淘宝虚拟商品开店方法 编辑:程序博客网 时间:2024/06/05 16:12
来源:http://www.bjsxt.com/
一、S02E199_01手写服务器httpserver_封装Response
<html> <head> <title>第一个表单</title> </head> <body> <pre> method:请求方式 get/post get:默认方式,数据量小,安全性不高 post:量大,安全性相对高 action:请求的服务器路径 id:编号,前端(用户的浏览器)区分唯一性,js中使用 name:名称,后端(服务器)区分唯一性,获取值 只要提交数据给后台,必须存在name </pre> <form method="post" action="http://localhost:8888/index.html"> 用户名:<input type="text" name="uname" id="name"/> 密码:<input type="password" name="pwd" id="pass"/> 兴趣:<input type="checkbox" name="fav" value="0"/>篮球 <input type="checkbox" name="fav" value="1"/>足球 <input type="checkbox" name="fav" value="2"/>乒乓球 <input type="submit" value="登录"> </form> </body></html>
package com.test.server;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){ //1)HTTP协议版本、状态代码、描述 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); //2)响应头(Response Head) 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 */ 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(); }}
package com.test.server;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * 创建服务器,并启动 * 1、请求 * 2、响应 */public class ServerForResponse2 { private ServerSocket server; public static void main(String[] args) { ServerForResponse2 server = new ServerForResponse2(); server.start(); } /** * 启动方法 */ public void start(){ try { server = new ServerSocket(8888); this.receive(); } catch (IOException e) { e.printStackTrace(); } } /** * 接收客户端 */ private void receive(){ try { Socket client =server.accept(); byte[] date = new byte[20480]; int len = client.getInputStream().read(date); //接收客户端的请求信息 String requestInfo = new String(date,0,len).trim(); System.out.println(requestInfo); //响应 Response rep = new Response(client.getOutputStream()); rep.println("<html><head><title>HTTP响应示例</title>"); rep.println("</head><body>Hello 你好!</body></html>"); rep.pushToClient(200); } catch (IOException e) { //e.printStackTrace(); } } /** * 停止服务器 */ public void stop(){ }}
二、S02E200_01手写服务器httpserver_封装Request_method_url
三、S02E201_01手写服务器httpserver_封装Request_储存参数_处理中文
package com.test.server;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 */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 = "";//接收请求参数 //1、获取请求方式 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")){//post方式 this.url = urlStr; paramString = requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim(); }else if(this.method.equalsIgnoreCase("get")){//get方式 if(urlStr.contains("?")){ String[] urlArray = urlStr.split("\\?"); this.url = urlArray[0]; paramString = urlArray[1];//接收请求参数 }else{ this.url = urlStr; } } //2、将请求参数封装到Map中 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"); //分拣,转换成Map 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) { //e.printStackTrace(); } 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]; }}
package com.test.server;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * 创建服务器,并启动 * 1、请求 * 2、响应 */public class ServerForResAndReq { private ServerSocket server; public static void main(String[] args) { ServerForResAndReq server = new ServerForResAndReq(); server.start(); } /** * 启动方法 */ public void start(){ try { server = new ServerSocket(8888); this.receive(); } catch (IOException e) { e.printStackTrace(); } } /** * 接收客户端 */ private void receive(){ try { Socket client =server.accept(); //请求 Request req = new Request(client.getInputStream()); //响应 Response rep = new Response(client.getOutputStream()); rep.println("<html><head><title>HTTP响应示例</title>"); rep.println("</head><body>"); rep.println("欢迎:").println(req.getParameterValue("uname")).println("回来"); rep.println("</body></html>"); rep.pushToClient(200); } catch (IOException e) { //e.printStackTrace(); } } /** * 停止服务器 */ public void stop(){ }}
0 0
- 手写服务器httpserver_封装Response_封装Request_JAVA199-201
- 手写服务器httpserver_封装分发器和多请求处理
- 手写服务器httpserver_封装分发器_多请求处理_多态_反射JAVA202-204
- 手写服务器httpserver_准备_Socket入门_htmlJAVA195-196
- 手写服务器httpserver_准备_http协议_http工具JAVA197-198
- 手写HTTPServer 之 HttpRequest封装
- iOS 手写签名的简单实用封装
- iOS 手写签名的简单实用封装
- 封装
- 封装
- 封装
- 封装
- 封装
- 封装
- 封装
- 封装
- 封装
- 封装
- linux文件权限管理
- (9)Python爬虫——下载PDF
- 算法题:1的数目
- vector向量容器元素排序与查找
- Genymotion添加模拟器时报“Unable to create virtual device,Server returned HTTP status code 0”
- 手写服务器httpserver_封装Response_封装Request_JAVA199-201
- couldn't connect to server 127.0.0.1 shell/mongo.js:79
- TalkingData 接入Cocos2d-x项目,symbol(s) not found for architecture arm64问题
- 命令模式
- ImageView里面的图片实现同时移动缩放旋转 photoView自定义
- NSURLConnection使用详解
- UESTC758(贪心)
- 算法导论:第15章 动态规划_5最优二叉搜索树
- Java中Serializable接口和Cloneable接口