BS通信,服务器代码模拟
来源:互联网 发布:sql 删除重复记录 编辑:程序博客网 时间:2024/05/21 22:56
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>
0 0
- BS通信,服务器代码模拟
- BS通信,代理模式,服务器转发分层代码
- [朝花夕拾]基于C#的模拟仿真平台设计(部分)及服务器异步通信代码
- 【GDOI2014模拟】服务器 题解+代码
- bs结构socket(udp)通信
- MAX1247 模拟SPI通信汇编代码
- BS版代码生成器 简介
- 模拟msn源代码-(与sb服务器通信,聊天session) (与NS服务器通信)
- C语言socket模拟客户和服务器通信
- 【BS】Windwos server 2008 服务器安装 IIS
- 基于hadoop2.7.2 api代码简单模拟rpc通信
- Verilog 扫描数码管 5461BS 实验代码
- 不改代码,CS转BS
- socket通信 简单的客户端和服务器的通信 服务器的代码
- spring中 使用JUnit4 测试 代码[模拟服务器启动]
- 模拟网上手机抽奖界面(供大家BS......)
- Java TCP通信(服务器和客户端代码)
- 转载一个Android和服务器通信的代码
- 构造函数,拷贝构造函数,析构函数,赋值运算符重载浅析
- TypeError: unhashable type: 'matrix'解决方法
- 好久没来
- 即时通讯--融云
- poj 2887 big string (块状链表)
- BS通信,服务器代码模拟
- hdoj 4686 Arc of Dream(矩阵快速幂)
- 粒子系统
- Android之Handler的postDelayed()方法的用法
- Static方法,与子类父类的执行顺序
- Kotlin-抽象类和接口
- video.min.js做视频播放
- Android网络篇
- 对于ViewPage设置transform参数的说明