博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
web服务器原理
阅读量:6096 次
发布时间:2019-06-20

本文共 5030 字,大约阅读时间需要 16 分钟。

web服务器原理

  一、参照博客,复制代码到idea中。在src包中建立Request.java文件,代码如图:

  

 
import java.io.*; public class Request {
/* * 接收请求的信息,并返回资源(文件名) * */ InputStream input; public Request(InputStream input) {
this.input=input; } public String getUri() throws IOException {
String content=null,str=null; StringBuffer request = new StringBuffer(); byte[] buffer = new byte[2048]; int i = 0; try {
i = input.read(buffer); //读取内容并存入buffer数组中,并返回读取的的字节数。 } catch (IOException e) {
e.printStackTrace(); i = -1; } //将buffer数组转换为字符串 for(int k = 0; k < i; k++) {
request.append((char)buffer[k]); } content=request.toString(); /* *以下方法错误!用该返回会使浏览器不断处于请求连接状态 * BufferedReader br=new BufferedReader(new InputStreamReader(input)); while((str=br.readLine())!=null) {
content=content+str+"\r\n"; } */ if(content!=null) return getFilename(content); else return null; } /*提取文件名*/ public String getFilename(String content) {
int a,b; a=content.indexOf(' '); if(a!=-1) {
b=content.indexOf('?',a+1); if(b==-1)b=content.indexOf(' ',a+1); return content.substring(a+2,b); } return null; } }
 

  建立Response.java文件

import java.io.*;import java.io.File;import java.io.IOException;import java.io.OutputStream;public class Response {    /**     * 响应并处理请求信息     */    public OutputStream output; public String filename; private static final int BUFFER_SIZE = 1024; public Response(OutputStream output,String filename) { this.output=output; this.filename=filename; } public void response() throws IOException { String path=System.getProperty("user.dir");//获取当前的工作目录 byte[] buffer = new byte[BUFFER_SIZE]; int ch; FileInputStream fis = null; System.out.println(path+File.separator+filename); if(path!=null&&filename!=null) { System.out.println(path+File.separator+filename); File file=new File(path,filename); String str=""; /*必须添加响应头,否则无法以html格式显示内容*/ if(file.exists()) { // System.out.println(1111); fis = new FileInputStream(file); str = "HTTP/1.1 200 OK \r\n" + "Content-Type: text/html\r\n" + "\r\n" ; output.write(str.getBytes()); ch = fis.read(buffer); while(ch != -1) { System.out.println(ch); output.write(buffer, 0, ch); ch = fis.read(buffer, 0, BUFFER_SIZE); } } else { // 200 OK str = "HTTP/1.1 200 File Not Found \r\n" + "Content-Type: text/html\r\n" + "Content-Length: 100\r\n" + "\r\n" + "

404 File Not Found!

"+ "\r\n" + "2222"; System.out.println(str); File fil=new File(path,"123.html"); fis = new FileInputStream(fil); output.write(str.getBytes()); ch = fis.read(buffer); while(ch != -1) { System.out.println(ch); output.write(buffer, 0, ch); ch = fis.read(buffer, 0, BUFFER_SIZE); } // output.write(str.getBytes()); } } output.close(); } }

  建立服务器java类:WebServer.java

import java.io.*;import java.net.*;public class WebServer {    /**     * web服务器:实现200和404操作     * 原理:     * 服务器监听一个端口,并读取浏览器的请求信息,从该信息提取出访问的资源(这里为文件名)。并在工作目录下查找是否有该资源,有则输出资源内容,否则返回404     * 测试方法:     * 1、用String path=System.getProperty("user.dir");获取当前的工作目录,并在该目录下放要测试的文件     * 2、访问127.0.0.1:8080/test.html     */    public static void main(String[] args) {        // TODO Auto-generated method stub        ServerSocket server = null;        Socket s=null; try { server=new ServerSocket(11113,3,InetAddress.getByName("127.0.0.1")); // server=new ServerSocket(8080); }catch(Exception e) { e.printStackTrace(); } while(true) { try{ s=server.accept(); System.out.println(s.toString()); OutputStream output=s.getOutputStream(); InputStream input=s.getInputStream(); //接收请求信息 Request request=new Request(input); String filename=request.getUri(); System.out.println(filename); //处理并响应请求信息 Response response=new Response(output,filename); response.response(); }catch(Exception e) { System.out.println("111"); e.printStackTrace(); } } } }

一、服务器端口占用问题

第一次运行后,在游览器端访问的时候抛出异常如下:

经过逐次排查和百度后发现是new ServerSocket()传入参数时的端口占有问题,抛出的常见异常为ServerSocket为空指针异常,因为idea里为Tomcat配置的默认端口为8080,可能在后台运行着其它Servlet服务,或者对该Web服务器存在着多次的启动。

解决方法: 1.修改传入参数为其他的端口。

      2.查看自己的idea或者eclipse是否存在如下图的服务器的多次启动问题,此时头一个服务器并没有关闭,所以存在了端口的占用。

二、游览器劫持404,拦截自定义的404页面

 在没有建立自己工程下的HTML文件时,游览器访问会出现如图所示的问题,并不是自己定义404页面

解释:测试了几个不同的游览器对此404问题的解决方法,和修改Response中字符串的响应头404为202等便可以正常显示如下:

三、建立html文件的路径问题

  学习过Servlet的朋友习惯下会把src或者web目录作为HTML访问的根目录(是因为Tomcat服务器经过处理),所以经常在测试的时候把.html,.jsp等文件建立在这两个目录下。但是自定义web服务器中,我们是通过System.getProperty("user.dir")方法获取当前的工作目录,所以.html文件需要建立在与src,web等相同的目录下才可以正常访问。

四、web服务器的运行流程

  Web服务器的工作原理一般可以分为如下4个步骤:连接过程、请求过程、应答过程、关闭连接。

  连接过程就是web服务器和其游览器之间建立的一种连接,查看连接过程是否实现,用户可以找到和打开socket这个虚拟文件,这个文件的建立意味着连接过程已经成功建立。

  请求过程就是web的服务器运用socket这个文件向其服务发出的各种请求。

  应答过程就是运用http协议把在请求过程中所提出的请求传输到web的服务器,进而实施任务处理,然后运用http协议与把处理结果传输到web的游览器,由游览器进行解析和渲染过程。

  关闭连接就是完成应答过程后服务器和游览器之间断开的过程。

转载于:https://www.cnblogs.com/xjtsh/p/10522642.html

你可能感兴趣的文章
修改GRUB2背景图片
查看>>
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
codeforce 599B Spongebob and Joke
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
9、Dubbo-配置(4)
查看>>
前端第七天
查看>>
BZOJ 2190[SDOI2008]仪仗队
查看>>
图解SSH原理及两种登录方法
查看>>
[转载] 七龙珠第一部——第058话 魔境圣地
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
P127、面试题20:顺时针打印矩阵
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>