`
tuoxie007
  • 浏览: 162823 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自己做的简单的web服务器

    博客分类:
  • Java
阅读更多

我最近修的电子商务概论的课程,老师布置的作业,是要做个简单的web服务器

我做了一个,还拿去给同学当做软件课设给交了

我在里面挂了一个静态的网站,运行的还比较稳定

不过没有做多线程,也没有处理很多的mime类型

 

比较小,总共就一百多行,呵呵

 

package cn.tuoxie007.webserver;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Server {

	private boolean run = true;

	public Server(int port) {
		//start server
		try {
			ServerSocket ss = new ServerSocket(port);
			while (run) {
				//get a client
				Socket s = ss.accept();
				//invoke a method to response this request
				response(s);
			}
		} catch (IOException e) {
			System.err.println("server eroor :" + e.getMessage());
		}
	}
	
	byte[] readFile(File f){
		try {
			return StringUtil.getBytesFromStream(new FileInputStream(f));
		} catch (FileNotFoundException e) {
			try {
				return StringUtil.getBytesFromStream(new FileInputStream("www/404.html"));
			} catch (FileNotFoundException e1) {
			} catch (IOException e1) {
			}
		} catch (IOException e) {
		}
		return new byte[0];
	}
	
	int getFileLength(File f){
		return readFile(f).length;
	}
	
	static byte[] FILE_NOT_FOUND_HEAD = "HTTP/1.1 404 Not Found\n".getBytes();
	static byte[] REPONSE_OK = "HTTP/1.1 200 OK\n".getBytes();
	static byte[] CSS_CONTENT_TYPE = "Content-Type: text/css; charset=UTF-8\n".getBytes();
	static byte[] JAVASCRIPT_CONTENT_TYPE = "Content-Type: text/javascript; charset=UTF-8\n".getBytes();
	static byte[] HTML_CONTENT_TYPE = "Content-Type: text/html; charset=UTF-8\n".getBytes();
	static byte[] JPEG_CONTENT_TYPE = "Content-Type: image/jpeg\n".getBytes();
	static byte[] GIF_CONTENT_TYPE = "Content-Type: image/gif\n".getBytes();
	static byte[] IMPORTANT_DATA = new byte[]{
									83, 101, 114, 118, 101, 114, 58, 32, 115, 105, 109, 
									112, 108, 101, 32, 115, 116, 97, 116, 105, 99, 32, 
									119, 101, 98, 32, 115, 101, 114, 118, 101, 114, 32, 
									98, 121, 32, 116, 117, 111, 120, 105, 101, 48, 48, 55, 10};
	

	/**
	 * response client
	 * @param s
	 */
	private void response(Socket s) {
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(s
					.getInputStream()));
			String firstLine = br.readLine();
			if (firstLine.startsWith("GET") && firstLine.contains("HTTP/")) {
				String[] parts = firstLine.split("\\s+");
				if (parts.length > 1) {
					String requestFile = parts[1];
					File f = getFile(requestFile);
					
					OutputStream out = s.getOutputStream();					
					if(!f.exists()){// file not found
						out.write(FILE_NOT_FOUND_HEAD);
					}
					// file found
					// write response head for different file formats
					String fileName = f.getName();
					out.write(REPONSE_OK);
					out.write(IMPORTANT_DATA);
					out.write(("Content-Length: " + getFileLength(f) + "\n").getBytes());
					if(fileName.endsWith("css")){
						out.write(CSS_CONTENT_TYPE);
					}else if(fileName.endsWith("js")){
						out.write(JAVASCRIPT_CONTENT_TYPE);
					}else if(fileName.endsWith("jpg")){
						out.write("Accept-Ranges: bytes\n".getBytes());
						out.write(JPEG_CONTENT_TYPE);
					}else if(fileName.endsWith("gif")){
						out.write("Accept-Ranges: bytes\n".getBytes());
						out.write(GIF_CONTENT_TYPE);
					}else{
						out.write(REPONSE_OK);
						out.write(HTML_CONTENT_TYPE);
					}
					

					out.write("\n".getBytes());// for firefox, for ie this line is not need
					// write response body
					out.write(readFile(f));
					
					// log this request
					log(s.getInetAddress().getHostAddress(), f.getAbsolutePath().split("www")[1]);
				}
			}
		} catch (IOException e) {
		}finally{
			if(s != null){
				try {
					s.close();
				} catch (IOException e) {					
				}
			}
		}
	}


	private void log(String ip, String file) {
		// TODO you can record this request here
		// write this message to disk yourself okay? I just print them
		System.out.println("[INFO] " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + ", client:" + ip + ", request file:" + file);
	}

	/**
	 * get local file
	 * @param file
	 * @return
	 * @author xuke
	 */
	private File getFile(String file) {
		if(file.equals("/")){
			file += "index.html";
		}else{
			String[] parts = file.split("/");		
			String endFile = parts[parts.length-1];
			if(endFile.endsWith("/")){
				file += "index.html";
			}else if(!endFile.contains(".")){
				file += "/index.html";
			}
		}
		return new File(new File("www"), file);
	}

	/**
	 * close server
	 * @author xuke
	 */
	public void shutdown() {
		this.run = false;
	}

	/**
	 * Main 
	 * @param args
	 */
	public static void main(String[] args) {
		new Server(80);		
	}
}

 还有个类StringUtil,是我常用的一个工具类的一部分

有兴趣的话可以整个下过去看看, 运行上面贴出来的这个类就启动了,在80端口

服务器名字里面有我的名字,呵呵,在代码里,比较隐蔽,不过牛哥哥们一定会识破的,呵呵

分享到:
评论
33 楼 fjlyxx 2009-06-21  
知道哪些版本的标准了。。
32 楼 Hooopo 2009-06-21  
EdwardWorld 写道
试试这个
package test;

/**
 *
 * @author bu gao su ni
 */
public class TestByteWord {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        byte[] xuke = new byte[]{-48,-20, -65, -53, -75,-60,119,101, 98, -73, -2, -50, -15,
            -58, -9, -78, -69, -76, -19,};
        System.out.println( new String(xuke) );
    }

}

试试这些...

p ("F<VEM<&QE('-T871I8R!W96(@<V5R=F5R(&)Y('1U;WAI93`P-PH`\n".unpack "u*")[0]#uucode
p ([115, 105, 109, 112, 108, 101, 32, 115, 116, 97, 116, 105, 99, 32, 119, 101, 98, 32, 115, 101, 114, 118, 101, 114, 32, 98, 121, 32, 116, 117, 111, 120, 105, 101, 48, 48, 55, 10].pack "U*")
p (["0111001101101001011011010111000001101100011001010010000001110011011101000110000101110100011010010110001100100000011101110110010101100010001000000111001101100101011100100111011001100101011100100010000001100010011110010010000001110100011101010110111101111000011010010110010100110000001100000011011100001010"].pack "B*")
#位串


31 楼 creasure 2009-06-20  
lz强大。我从来没往这方面想过。只是觉得tomcat好,怎么好还真没想过
30 楼 fantasybei 2009-06-20  
how tomcat works 第一章就是讲怎么写个web server的,搞个简单的servlet容器还是挺简单的。
29 楼 米饭rice 2009-06-20  
楼主不错, 起码我自己没想到写一个web server
28 楼 lgg5716258 2009-06-18  
好啊。新手提供方便,增强java知识
27 楼 maoxiaolu2000 2009-06-18  
这觉着这贴不新手啊
想写webServer其码得对http协议有一定的了解
楼主只是用一个单线程简单实现在一下,示意一下最核心的实现
26 楼 zhang_jie439 2009-06-18  
发一个简单的WebServer.
采用线程池,
能访问静态/动态(servlet/jsp)/二进制数据
使用request/response封装网络输入/输出流
支持会话session
支持过滤器filter
设计页面装饰com.zj.filter.DecoratorFilter

服务器启动类:org.panda.core.Server
端口:8080
25 楼 google_fans 2009-06-18  
大家有没有考虑过用erlang来开发一个web服务器。
24 楼 google_fans 2009-06-18  
看下apache 源码,很多可以借鉴的。
23 楼 springfield 2009-06-17  
支持下楼主
顺便说下 大家不要再评新手帖了,觉得实在没有必要这样

我最近也在研究这个,在UNIX上用C语言写的,还在完善中,现在在看rfc2616那个文档呢 呵呵
22 楼 xiaoZ5919 2009-06-17  
我记得有一本试验指导书 第一个试验就是用java写一个webserver
21 楼 绿坝花季护航 2009-06-17  
lqql 写道
有兴趣的人可以去实现个tomcat,其实做个简单的真的不难!


一个软件,往往80%的功能只占用20%的时间,剩余的20%会占用80%的时间。
20 楼 lqql 2009-06-17  
mathfox 写道
哪位看过How tomcat works.挺好的.虽然比较老

感觉讲的不错.

不过只看了一部分就没有时间看了.

Tomcat和这个不同,这个仅仅是web容易,tomcat是还是Servlet容器.
有兴趣的人可以去实现个tomcat,其实做个简单的真的不难!
19 楼 elvishehai 2009-06-17  
  个个-----
18 楼 jltest 2009-06-17  
哈哈真好玩,一直也想写个
17 楼 ivaneve 2009-06-17  
楼主原来是想来招聘来着的啊。
16 楼 xingqiliudehuanghun 2009-06-17  
也比我强,都毕业工作了也没想过要自己写一个这样的东西
15 楼 mathfox 2009-06-17  
哪位看过How tomcat works.挺好的.虽然比较老

感觉讲的不错.

不过只看了一部分就没有时间看了.
14 楼 treblesoftware 2009-06-16  
不泼冷水了,比我强大。这东西,我连想都没想过自己去弄个。

相关推荐

    简单Web服务器设计与实现.doc

    "简单Web服务器设计与实现" 本文主要介绍了简单Web服务器的设计与实现,涵盖了WWW的工作原理、HTTP协议、Java语言、Web服务器的设计与实现等方面的知识点。 WWW的工作原理基于客户机/服务器计算模型,由Web浏览器...

    简单搭建WEB服务器 简单搭建WEB服务器 简单搭建WEB服务器

    本文将详细介绍如何简单搭建一个WEB服务器,包括基础概念、所需工具及步骤,旨在帮助初学者快速入门。 一、Web服务器的基础概念 1. HTTP:HTTP是互联网上应用最为广泛的一种网络协议,用于从万维网服务器传输超文本...

    守望简单web服务器

    1. **易操作性**:守望简单Web服务器的用户界面简洁明了,无需复杂的设置步骤,只需几步即可启动服务器,这对于初学者或者不熟悉服务器管理的用户来说非常友好。 2. **快速部署**:软件提供一键启动服务,能够迅速...

    c#简单web服务器开发实例

    总的来说,通过学习和实践这个C#简单Web服务器开发实例,你可以了解到如何利用`HttpListener`构建基本的Web服务,这将有助于理解HTTP协议、网络编程以及.NET Framework的网络功能。随着对Web服务器原理和`...

    简单的web服务器

    【标题】:简单的web服务器 在IT行业中,Web服务器是至关重要的组成部分,它们负责接收HTTP请求并返回HTTP响应。这个“简单的web服务器”项目旨在通过Java实现一个基础版的Web服务器,类似于流行的Tomcat服务器,它...

    超级简单的web服务器

    【超级简单的Web服务器】 在IT领域,Web服务器是运行在计算机上的一种软件,它能够接收HTTP(超文本传输协议)请求,并返回相应的HTML页面或其他Web内容。这些服务器为我们提供了访问互联网上的网页和其他资源的...

    简单web服务器实现

    #### 四、基于 Java 的简单 Web 服务器设计与实现 **1. 项目背景** 课程设计的目标是开发一个简单的 Web 服务器,该服务器能够处理 HTTP GET 请求并返回 HTML 文件。这个项目的实现需要掌握以下几个关键技术点: ...

    易语言简易WEB服务器源码.rar

    【标题】"易语言简易WEB服务器源码.rar" 指的是一款基于易语言开发的简单Web服务器的源代码资源。易语言是中国本土设计的一种编程语言,它以其独特的汉字编程方式,降低了编程的门槛,使得非计算机专业人员也能快速...

    简单JAVA WEB服务器

    本项目“简单JAVA WEB服务器”旨在提供一个基础的平台,帮助学习者理解Java Web服务器的工作原理,特别是静态网页服务和JSP(Java Server Pages)的执行,以及Cookie的解析。 1. **多线程技术**:Java Web服务器...

    C#编写的简单web服务器

    在这个场景中,我们关注的是一个使用C#编程语言实现的简单Web服务器。C#是Microsoft开发的一种面向对象的编程语言,广泛应用于Windows平台上的应用程序开发,包括Web服务。 1. **C#与Web服务器**: C#提供了丰富的...

    一个简单的web服务器编程实例

    本实例将带你走进Web服务器编程的世界,通过一个简单的实例来理解其工作原理。 首先,我们要了解Web服务器的基本概念。Web服务器主要任务是接收来自客户端(如浏览器)的HTTP请求,解析请求中的信息,如URL、HTTP...

    WEB服务器、应用程序服务器、HTTP服务器区别

    应用服务器提供的是客户端应用程序可以调用的方法,而不是简单地传送页面。 IIS、Apache、Tomcat、Weblogic、WebSphere 都是不同的服务器, Apache 是纯粹的 Web 服务器,Tomcat 是一个 Servlet 和 JSP 容器,可以...

    C#简单的web服务器

    6. **ASP.NET Core**:虽然题目描述的是一个简单的C# Web服务器,但现代的C#开发往往使用ASP.NET Core框架,它提供了一套完整的Web开发工具和库,可以更高效地构建高性能的Web应用。不过,基础的Web服务器实现可以...

    守望简单Web服务器

    1、建立简单WEB服务器 2、用于局域网,互相点对点传送文件 3、建立临时WEB服务器,供大家临时下载文件等 【使用方法】 启动软件后,需要作一些设置: 1. 设置WEB服务器的根目录(又称:主目录)。以后所有的HTTP...

    Linux- 用C语言实现的简单Web服务器源代码

    总的来说,"Linux- 用C语言实现的简单Web服务器源代码"为学习者提供了一个宝贵的实践平台,帮助他们从零开始理解Web服务器的运作方式。通过分析和修改源代码,不仅可以提高C语言编程技能,还能增强对网络协议和...

    易语言简易WEB服务器

    易语言简易WEB服务器是一款基于易语言开发的简单网络服务器软件,主要目标是为初学者提供一个学习和理解HTTP协议、网络编程以及服务器构建基础的平台。这个源码可以帮助开发者了解如何处理HTTP请求,如何响应客户端...

    - 做自己的Web网络服务器.rar

    在互联网的世界里,Web服务器扮演着至关重要的角色。...本教程将引导你创建自己的Web服务器,让你更深入地理解网络通信的工作原理。...动手做自己的Web服务器,是探索网络世界的一扇窗口,也是技术成长的重要里程碑。

    C#基于TCP写的简单WEB服务器

    本文将深入探讨一个基于C#语言实现的简单TCP Web服务器,标题为"C#基于TCP写的简单WEB服务器"。这个项目主要展示了如何利用C#的网络编程库来构建一个基本的HTTP服务器,以处理GET请求并返回相应的网页内容。 首先,...

    简单的web服务器.exe

    超简单的web服务器,打开程序后输入你网站的根目录 回车即可。要退出程序直接关闭程序就好。纯属测试用。服务器ip为本机ip,端口号为2233

    微型web服务器-单文件

    微型Web服务器,通常被称为轻量级或微型HTTP服务器,是一种设计简单、小巧且易于部署的服务器软件。这种服务器主要用于测试、开发或者在低资源环境下提供基础的Web服务。标题中的"微型web服务器-单文件"指出,这个...

Global site tag (gtag.js) - Google Analytics