Tomcat详解—HttpServer,request,response
来源:互联网 发布:软件就业班 编辑:程序博客网 时间:2024/06/11 19:48
- 首先说说httpserver类:这个类的主要功能就是创建一个serversocket类对象一直等待,等待客户端来链接,获取连接后,获取socket的输入流(携带了客户端的信息,用于构建request)和输出流(用于构建response),然后分别新建Request和Response类实例,接着把request实例对象传给response,response调用其sendStaticResource()方法获取request实例里面的信息,做相应的处理。
- new request(socket.getInputStream()),会根据socket里面的输入流的信息,创建一个request实例,具体如果实现请看下面request类的部分源码。
- new Response(socket.getOutputStream());这里是引socket的输出流做参数构建新的response实例。关于java I/O不是很清楚的,或者源码不了解的,可以看看这个人的博客 我也在看这个,感觉写的非常详细。
- response调用setRequest(request)方法,在调用sendStaticResource()方法前一定要调用setRequest(request),因为这个方法会用到传进来的request。
下面给出源码,并做说明。注:这里只给出了部分相关源码,并不都是全部。
public class HttpServer { public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot"; private static final String SHUTDOWN_COMMAND = "/SHUTDOWN"; private boolean shutdown = false; public static void main(String[] args) { HttpServer server = new HttpServer(); server.await(); } public void await() { ServerSocket serverSocket = null; int port = 8080; try { serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1")); } catch (IOException e) { e.printStackTrace(); System.exit(1); } while (!shutdown) { Socket socket = null; InputStream input = null; OutputStream output = null; try { socket = serverSocket.accept(); input = socket.getInputStream();获取输入流 output = socket.getOutputStream(); Request request = new Request(input); request.parse();//这里是把字节流的http请求的数据解析成request类 Response response = new Response(output); response.setRequest(request); response.sendStaticResource(); socket.close(); shutdown = request.getUri().equals(SHUTDOWN_COMMAND);//调用requet的getUri()方法,判断是否是否为关闭//就是在request内部在处理得到的uri,会把uri字符串不断地解析,以及不断地剪切(解析完一段就切去这一段),最后//如果剩下的内容为空,则会跳出循环。后面会详细讲解。 } catch (Exception e) { e.printStackTrace(); continue; } } }}
public class Request { private InputStream input; private String uri; public Request(InputStream input) { this.input = input; } public void parse() { // Read a set of characters from the socket StringBuffer request = new StringBuffer(2048); int i; byte[] buffer = new byte[2048];//这里定死的是2048个字节,所以如果你用get方法提交很长的文本时,会以字符串 //uri的形式解析。也因此,get提交时,不要提交过长的数据 try { i = input.read(buffer); } catch (IOException e) { e.printStackTrace(); i = -1; } for (int j=0; j<i; j++) { request.append((char) buffer[j]);//把byte强转成char,最后追加到String字符串request中 } System.out.print(request.toString());//这里是这样的 POST /examples/default.jsp HTTP/1.1 uri = parseUri(request.toString());//这里是这样的 /examples/default.jsp } private String parseUri(String requestString) { int index1, index2; index1 = requestString.indexOf(' '); if (index1 != -1) { index2 = requestString.indexOf(' ', index1 + 1); if (index2 > index1) return requestString.substring(index1 + 1, index2); } return null; } public String getUri() { return uri; }}
public class Response { private static final int BUFFER_SIZE = 1024; Request request; OutputStream output; public Response(OutputStream output) {//获取socket字节输出流 this.output = output; } public void setRequest(Request request) {//获取request对象 this.request = request; } public void sendStaticResource() throws IOException {//发送一个静态资源给浏览器<如果是访问servlet,会用另外方法> byte[] bytes = new byte[BUFFER_SIZE]; FileInputStream fis = null; try { File file = new File(HttpServer.WEB_ROOT, request.getUri());//获取静态文件的地址 if (file.exists()) { fis = new FileInputStream(file); int ch = fis.read(bytes, 0, BUFFER_SIZE); while (ch!=-1) { output.write(bytes, 0, ch); ch = fis.read(bytes, 0, BUFFER_SIZE); } } else { // file not found String errorMessage = "HTTP/1.1 404 File Not Found\r\n" + "Content-Type: text/html\r\n" + "Content-Length: 23\r\n" + "\r\n" + "<h1>File Not Found</h1>"; output.write(errorMessage.getBytes());//向浏览器输出错误信息 } } catch (Exception e) { // thrown if cannot instantiate a File object System.out.println(e.toString() ); } finally { if (fis!=null) fis.close(); } }}
阅读全文
1 0
- Tomcat详解—HttpServer,request,response
- Request和Response详解
- Request和Response详解
- Request和Response详解
- Request 和 Response 详解
- 详解Response、Request一
- 详解Response、Request二
- Request和Response详解
- Request和Response详解
- 详解request.getRequestDispatcher(url).forword(request,response)
- Tomcat架构详解(三) Request和Response处理的全过程
- Tomcat Request和Response处理流程
- Tomcat学习之Request/Response封装
- 请教:tomcat 生成 session 、 request 和 response
- Tomcat学习之Request/Response封装
- tomcat学习之request与response
- Tomcat学习之Request/Response封装
- Tomcat学习之Request/Response封装
- Elastic Search快速上手(4):细节补充
- 获取地址栏参数
- 在IIS7中安装SSL证书
- 怎样用jquery编码和解码?
- 数据库DevOps:我们如何提供安全、稳定、高效的研发全自助数据库服务-iDB/DMS企业版
- Tomcat详解—HttpServer,request,response
- Mysql进行复杂查询
- 公交卡植入手机
- Java中解决 cannot be cast to java.io.Serializable的问题
- 如何使一个程序运行唯一实例
- bzoj 4515: [Sdoi2016]游戏
- css的样式选择优先级
- bzoj 3363: [Usaco2004 Feb]Cow Marathon 奶牛马拉松 树的直径
- bzoj1207: [HNOI2004]打鼹鼠(Dp)