运行结果:

1、WebServer.java文件

 package webserver;

 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(8080,3,InetAddress.getByName("127.0.0.1"));
}catch(Exception e)
{
e.printStackTrace();
}
while(true)
{
try{
s=server.accept();
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)
{
e.printStackTrace();
}
}
} }

2、Request.java

 package webserver;
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;
}
}

3、Response.java

 package webserver;

 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)
{
File file=new File(path,filename);
String str="";
/*必须添加响应头,否则无法以html格式显示内容*/
if(file.exists())
{
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) {
output.write(buffer, 0, ch);
ch = fis.read(buffer, 0, BUFFER_SIZE);
}
}
else
{
str = "HTTP/1.1 404 File Not Found \r\n" +
"Content-Type: text/html\r\n" +
"Content-Length: 100\r\n" +
"\r\n" +
"<h1>404 File Not Found!</h1>";
output.write(str.getBytes());
}
}
output.close();
}
}

用Java实现简单的web服务器的更多相关文章

  1. java实现一个简单的Web服务器

    注:本段内容来源于<JAVA 实现 简单的 HTTP服务器> 1. HTTP所有状态码 状态码 状态码英文名称 中文描述 100 Continue 继续.客户端应继续其请求 101 Swi ...

  2. 深入剖析tomcat之一个简单的web服务器

    这个简单的web服务器包含三个类 HttpServer Request Response 在应用程序的入口点,也就是静态main函数中,创建一个HttpServer实例,然后调用其await()方法. ...

  3. Tomcat剖析(一):一个简单的Web服务器

    Tomcat剖析(一):一个简单的Web服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器 ...

  4. 徒手用Java来写个Web服务器和框架吧<第三章:Service的实现和注册>

    徒手用Java来写个Web服务器和框架吧<第一章:NIO篇> 徒手用Java来写个Web服务器和框架吧<第二章:Request和Response> 这一章先把Web框架的功能说 ...

  5. 徒手用Java来写个Web服务器和框架吧<第二章:Request和Response>

    徒手用Java来写个Web服务器和框架吧<第一章:NIO篇> 接上一篇,说到接受了请求,接下来就是解析请求构建Request对象,以及创建Response对象返回. 多有纰漏还请指出.省略 ...

  6. Tomcat学习笔记(一)一个简单的Web服务器

    内容为<深入剖析Tomcat>第一章重点,以及自己的总结,如有描述不清的,可查看原书. 一.HTTP协议: 1.定义:用于服务器与客户端的通讯的协议,允许web服务器和浏览器通过互联网进行 ...

  7. 自己模拟的一个简单的web服务器

    首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...

  8. 各种容器与服务器的区别与联系 Servlet容器 WEB容器 Java EE容器 应用服务器 WEB服务器 Java EE服务器

    转自:https://blog.csdn.net/tjiyu/article/details/53148174 各种容器与服务器的区别与联系 Servlet容器 WEB容器 Java EE容器 应用服 ...

  9. 《深度解析Tomcat》 第一章 一个简单的Web服务器

    本章介绍Java Web服务器是如何运行的.从中可以知道Tomcat是如何工作的. 基于Java的Web服务器会使用java.net.Socket类和java.net.ServerSocket类这两个 ...

随机推荐

  1. 【荐】使用eval()、new Function()将JSON字符串转换为JSON对象

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用j ...

  2. Windows 7安装解压版MySQL 5.6(不包含配置文件优化)

    到官网下载MySQL5.6 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html, 提供了 .exe版本 和 .zip解压版,因为我的操作系统是64位的 ...

  3. MySQL 5.5编译安装

    MYSQL数据库安装方法 yum/rpm方式安装mysql 只要执行yum install mysql-server即可. yum/rpm方式安装mysql应用场景:yum/rpm安装适用对数据库要求 ...

  4. 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面

    详细错误:HTTP 错误 404.2 - Not Found. 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面. 出现环境:win7 + IIS7.0 解决办法 ...

  5. 十六天 css汇总、js汇总、dom汇总

    1.css补充之  后台管理界面  顶部导航栏.左边菜单栏.右边内容栏固定在屏幕相应位置 会有上下左右滚动条,设定窗口最小值,使页面不乱.注意overflow:auto要与position:absol ...

  6. WPF三大模板简介(Z)

    WPF三大模板简介   WPF支持以下类型的模板: (1) 控件模板.控件模板可以将自定义模板应用到某一特定类型的所有控件,或是控件的某一实例.决定控件外观的是ControlTemplate,它决定了 ...

  7. go:匿名函数与闭包

    一.匿名函数 定义:没有函数名的函数. 作用:在go语言中目前了解的作用就是用于构成闭包. *注:由于javascript不存在块级作用域,故匿名函数常用来包含代码以不污染全局命名空间,运行后销毁环境 ...

  8. (2016弱校联盟十一专场10.3) A.Best Matched Pair

    题目链接 #include<cstdio> #include<cstring> #include<algorithm> #include<stack> ...

  9. Webstorm配置CSS/SCSS自动补全兼容前缀autoprefixer插件

    关于Autoprefixer Autoprefixer是一个后处理程序,不象Sass以及Stylus之类的预处理器.它适用于普通的CSS,可以实现css3代码自动补全.也可以轻松跟Sass,LESS及 ...

  10. NYOJ题目20吝啬的国度

    -----------------------------------------n-1条边的无向连通图是一棵树,又因为树上两点之间的路径是唯一的,所以解是唯一的.(注意并不一定是二叉树,所以最好采用 ...