`
guazi
  • 浏览: 54501 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

用java实现的一个简单的web服务器

    博客分类:
  • java
阅读更多
总说自己是做web开发的,但是却对http协议一无所知,有些许惭愧,前几天比较闲,就研究了一下http协议和web服务器,用java做了一个简单的web服务器,当然太简单了,只能做个理解使用。不过还是可以返回html的。可以接受简单的访问。有兴趣的可以看看。欢迎交流!
/**
 * 用Java语言实现HTTP服务器,首先启动一个java.net.ServerSocket在提供服务的端口上监听连接.向客户返回文本时,可以用
 * PrintWriter,但是如果返回二进制数据,则必须使用OutputStream.write(byte[])方法,返回的应答消息字符串可以使用
 * String.getBytes()方法转换为字节数组返回,或者使用PrintStream的print()方法写入文本,用
 * write(byte[])方法写入二进制数据.
 * 
 * 以工程所在目录为web的根目录。 在工程的根目录下放一个大概如下的index.html
 * 
 * <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 * "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta
 * http-equiv="Content-Type" content="text/html; charset=gbk">
 * <title>简单的测试</title> </head> <body> 你好!这是一个 简单的web服务器。<br>
 * 这是一个图片!<br>
 * 
 * <form action="/index.html"> <img alt="" src="images/test.gif"><br>
 * 姓名:<input type="text" name="name" /><br>
 * 密码:<input type="password" name="pass"></input><br>
 * <input type="submit"/> </form> </body> </html>
 * 
 * 放入图片位置: 工程根目录/images/test.gif <br>
 * 打开浏览器输入http://localhost/index.html 可以展示index.html
 * 
 * @author guazi
 */
public class SimpleHttpServer implements Runnable {
	
	ServerSocket serverSocket;// 服务器Socket

	
	/**
	 * 服务器监听端口, 默认为 80.
	 */
	public static int PORT = 80;// 标准HTTP端口

	/**
	 * 开始服务器 Socket 线程.
	 */
	public SimpleHttpServer() {
		try {
			serverSocket = new ServerSocket(PORT);
		} catch (Exception e) {
			System.out.println("无法启动HTTP服务器:" + e.getMessage());
		}
		if (serverSocket == null)
			System.exit(1);// 无法开始服务器

		new Thread(this).start();
		System.out.println("HTTP服务器正在运行,端口:" + PORT);
	}

	
	/**
	 * 运行服务器主线程, 监听客户端请求并返回响应.
	 */
	public void run() {
		while (true) {
			try {
				Socket client = null;// 客户Socket
				client = serverSocket.accept();// 客户机(这里是 IE 等浏览器)已经连接到当前服务器
				if (client != null) {
					System.out.println("连接到服务器的用户:" + client);
					try {
						// 第一阶段: 打开输入流
						BufferedReader in = new BufferedReader(
								new InputStreamReader(client.getInputStream()));

						System.out.println("客户端发送的请求信息: ***************");
						// 读取第一行, 请求地址
						System.out.println("http协议头部信息:");
						String line = in.readLine();
						System.out.println(line);
						String resource = line.substring(line.indexOf('/'),
								line.lastIndexOf('/') - 5);
						// 获得请求的资源的地址
						resource = URLDecoder.decode(resource, "gbk");// 反编码

						String method = new StringTokenizer(line).nextElement()
								.toString();// 获取请求方法, GET 或者 POST

						// 读取浏览器发送过来的请求参数头部信息
						while ((line = in.readLine()) != null) {
							System.out.println(line);

							if (line.equals(""))
								break;
						}

						System.out.println("http协议头部结束 ***************");
						System.out.println("用户请求的资源是:" + resource);
						System.out.println("请求的类型是: " + method);

						String params = null;

						if (resource.indexOf("?") > -1) {
							params = resource
									.substring(resource.indexOf("?") + 1);
							resource = resource.substring(0, resource
									.indexOf("?"));
						}

						// 显示 POST 表单提交的内容, 这个内容位于请求的主体部分
						if ("POST".equalsIgnoreCase(method)) {
							if (params != null) {
								params +="&" + in.readLine();
							}else{
							        params =in.readLine();
							}
						}

						System.out.println("打印提交的数据:");
						printParams(params);

						// 读取资源并返回给客户端
						fileReaderAndReturn(resource, client);
						// 关闭客户端链接
						client.close();
						System.out.println("客户端返回完成!");
					} catch (Exception e) {
						System.out.println("HTTP服务器错误:" + e.getMessage());
					}
				}

			} catch (Exception e) {
				System.out.println("HTTP服务器错误:" + e.getMessage());
			}
		}
	}

	/**
	 * 读取一个文件的内容并返回给浏览器端.
	 * 
	 * @param fileName
	 *            文件名
	 * @param socket
	 *            客户端 socket.
	 * @throws IOException
	 */
	void fileReaderAndReturn(String fileName, Socket socket) throws IOException {
		if ("/".equals(fileName)) {// 设置欢迎页面,呵呵!
			fileName = "/index.html";
		}
		fileName = fileName.substring(1);

		PrintStream out = new PrintStream(socket.getOutputStream(), true);
		File fileToSend = new File(fileName);

		String fileEx = fileName.substring(fileName.indexOf(".") + 1);
		String contentType = null;
		// 设置返回的内容类型
		// 此处的类型与tomcat/conf/web.xml中配置的mime-mapping类型是一致的。测试之用,就写这么几个。
		if ("htmlhtmxml".indexOf(fileEx) > -1) {
			contentType = "text/html;charset=GBK";
		} else if ("jpegjpggifbpmpng".indexOf(fileEx) > -1) {
			contentType = "application/binary";
		}

		if (fileToSend.exists() && !fileToSend.isDirectory()) {
			// http 协议返回头
			out.println("HTTP/1.0 200 OK");// 返回应答消息,并结束应答
			out.println("Content-Type:" + contentType);
			out.println("Content-Length:" + fileToSend.length());// 返回内容字节数
			out.println();// 根据 HTTP 协议, 空行将结束头信息

			FileInputStream fis = null;
			try {
				fis = new FileInputStream(fileToSend);
			} catch (FileNotFoundException e) {
				out.println("<h1>404错误!</h1>" + e.getMessage());
			}
			byte data[];
			try {
				data = new byte[fis.available()];

				fis.read(data);
				out.write(data);
			} catch (IOException e) {
				out.println("<h1>500错误!</h1>" + e.getMessage());
				e.printStackTrace();
			} finally {
				out.close();
				try {
					fis.close();
				} catch (IOException e) {

					e.printStackTrace();
				}
			}
		} else {
			out.println("<h1>404错误!</h1>" + "文件没有找到");
			out.close();

		}

	}

	void printParams(String params) throws IOException {
		if (params == null) {
			return;
		}
		String[] maps = params.split("&");
		for (String temp : maps) {
			String[] map = temp.split("=");
			System.out.println(map[0] + "==" + map[1]);
		}
	}

	/** */
	/**
	 * 启动 HTTP 服务器
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			if (args.length != 1) {
				System.out.println("这是一个简单的web服务器 ,端口是: 80.");
			} else if (args.length == 1) {
				PORT = Integer.parseInt(args[0]);
			}
		} catch (Exception ex) {
			System.err.println("服务器初始化错误" + ex.getMessage());
		}

		new SimpleHttpServer();
	}

分享到:
评论
17 楼 leo_soul 2010-09-03  
allskylove 写道
jdk 里面就有了!不过楼主自己实现精神可嘉!

我也正在写一个小的http服务器,jdk里有能直接作为http服务器的类吗?方便的解析http内容。
16 楼 nishizhutoua 2009-12-12  
如果真是想做web服务器,不建议用大try catch块.
如果怕某个处理流程错误导致服务器挂掉,那在收到http请求的第一时间将请求打包发给线程池中的其他线程再说.
15 楼 guazi 2009-12-11  
spiritfrog 写道
lz的代码对于post请求参数好像解析的不对
确实有问题,发现只顾着判断url?后边的东西了,忘了url后没有?好的情况了。真是大意。修改了一下。
// 显示 POST 表单提交的内容, 这个内容位于请求的主体部分  
                        if ("POST".equalsIgnoreCase(method)) {  
                            if (params != null) {  
                                params += "&"+in.readLine();  
                            }else{  
                                    params =in.readLine();  
                            }  
                        }  

14 楼 comsci 2009-12-11  
支持原创的,支持自主创新
13 楼 guazi 2009-12-11  
抛出异常的爱 写道
如果能把jsp变severlet的代码上来的话更好

这个太简单了,还不能运行servlet。继续研究中。
12 楼 guazi 2009-12-11  
asialee 写道
这个服务器段虽然采取了多线程,但是在处理时还是阻塞的,建议看一下我的tomcat的代码分析。

正要看看tomcat,刚开始时一看太多东西,感觉无从下手,就搞这个了。
11 楼 guazi 2009-12-11  
spiritfrog 写道
lz的代码对于post请求参数好像解析的不对

能不能把异常贴来看一下,有些情况可能没有考虑到。
10 楼 xiaobin0530 2009-12-10  
spiritfrog 写道
lz的代码对于post请求参数好像解析的不对
把异常打印下,数组越界。
9 楼 spiritfrog 2009-12-10  
lz的代码对于post请求参数好像解析的不对
8 楼 抛出异常的爱 2009-12-10  
如果能把jsp变severlet的代码上来的话更好
7 楼 treblesoftware 2009-12-10  
LZ等于把JAVA.NET这个包又封了下。
6 楼 asialee 2009-12-10  
这个服务器段虽然采取了多线程,但是在处理时还是阻塞的,建议看一下我的tomcat的代码分析。
5 楼 topcode 2009-12-10  
路过,楼主不错 .
4 楼 晨星★~雨泪 2009-12-10  
听说apache下的 httpComponents  不错,对于理解http协议很有帮助,最近我也在弄这个,呵呵,很好玩,有时间多多交流啊
3 楼 whaosoft 2009-12-10  
wujiazhao88 写道
ls的不是很靠谱,服务器还是功能独立的好,不必融到浏览器中。

同意~
lz的这个挺好玩的 现在就去试试~ 一会告诉你答案
2 楼 wujiazhao88 2009-12-10  
ls的不是很靠谱,服务器还是功能独立的好,不必融到浏览器中。
1 楼 nishizhutoua 2009-12-09  
期待浏览器内置微型web服务器时代的到来,到时候浏览器代理接收数据,js负责处理数据,就好玩了.

相关推荐

    JAVA实现的简单的web服务器

    "JAVA实现的简单的web服务器"项目正是这样一个实例,它演示了如何利用Java语言构建一个基本的HTTP服务器,能够处理GET请求并返回HTML页面或图片。在这个过程中,开发者会接触到网络编程、多线程以及HTTP协议等相关...

    计算机网络实验一 Windows环境下用java实现web服务器

    在本实验中,我们将探索如何在Windows环境下使用Java语言实现一个基本的Web服务器。这个实践项目旨在深化学生对HTTP协议的理解,以及Web服务器的工作机制。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络...

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

    本文 SYSTEM设计了一个简单的Web服务器,采用了Java语言和Eclipse平台,实现了基本的Web服务器功能,并且能够通过HTTP GET命令获得一个简单的HTML文件。该设计可以应用在商业中解决实际问题,为Web开发和网络应用...

    简单JAVA WEB服务器

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

    一个支持servlet的web服务器.rar

    这个压缩包“一个支持servlet的web服务器.rar”很可能包含了实现这一功能的源代码、配置文件或者是一个预编译好的服务器软件,允许开发者在本地环境中运行和测试Servlet应用。下面我们将深入探讨Servlet以及如何在...

    JAVA服务器]用Java实现Web

    以下是一个简单的Java Web服务器示例,仅处理GET请求: ```java import java.net.*; import java.io.*; public class SimpleHttpServer { public static void main(String[] args) throws IOException { int ...

    java 实现简单web服务器

    用java语言实现了最简单的web服务器,供大家参考!

    用Java实现Web服务器

    总的来说,"用Java实现Web服务器"是一个锻炼基础网络编程和多线程技能的好项目。它可以帮助开发者深入理解网络通信过程,提升Java编程能力,同时为理解和开发更复杂的Web应用打下坚实基础。虽然目前的实现存在局限性...

    Java实现简单的web文件服务器

    在本文中,我们将深入探讨如何使用Java来实现一个简单的Web文件服务器。这个项目不仅适合Java初学者,也是学习网络编程的绝佳实践。我们将讨论以下几个关键知识点: 1. **TCP与UDP协议**: - TCP(Transmission ...

    Java Socket实现简单的web服务器

    Java Socket实现简单的Web服务器是一个基础但实用的编程实践,它涉及到网络编程、HTTP协议和文件I/O等核心概念。在本项目中,我们利用Java的Socket API构建了一个基本的服务器,该服务器仅处理HTTP GET请求并返回...

    用java实现Web服务器

    下面是一个简单的Java程序示例,用于实现一个基本的多线程Web服务器: ```java public class WebServer { public static void main(String[] args) { int PORT = 8080; ServerSocket server = null; Socket ...

    Java开发的简单WEB服务器源码Java实用源码整理learns

    标题中的“Java开发的简单WEB服务器...通过阅读和分析源码,你可以学习到如何使用Java实现一个简单的Web服务器,这对于提升Java网络编程和Web开发技能非常有帮助。同时,这也是一个实践和理解Web服务背后逻辑的好机会。

    Java开发的简单WEB服务器源码

    本项目标题为“Java开发的简单WEB服务器源码”,意味着它提供了一个用Java语言编写的Web服务器的源代码,我们可以从中学习到如何构建一个能响应HTTP请求并返回静态资源的服务器。 首先,我们要了解Web服务器的基本...

    Java开发的简单WEB服务器源码Java源码

    在Java编程领域,构建一个简单的Web服务器是一项常见的学习任务,它能帮助开发者理解HTTP协议、网络编程以及服务器端处理请求的基本原理。本源码提供了一个基础的实现,适合初学者研究和学习。下面我们将深入探讨这...

    简单Web服务器(Java实现)

    这是《计算机网络》的课程设计--多线程的Web服务器(带有课程设计报告),里面为Eclipse3.5的工程。支持HTTP1.1(但是不完善),支持多线程(采用的线程池),支持简单CGI(仅PHP的CGI模块通过测试),支持配置文件...

    Java Socket编程实现的简单多线程WEB服务器

    在本文中,我们将详细介绍如何使用 Java 的 Socket 编程实现一个简单的多线程 WEB 服务器。 Socket 编程简介 Socket 编程是 Java 网络编程的基础,它允许开发者创建客户端和服务器端的网络应用程序。Socket 是一种...

    JAVA实现的简单的WEB服务器

    【JAVA实现的简单的WEB服务器】 在Java编程领域,创建一个简单的Web服务器是一项常见的学习任务,它可以帮助理解HTTP协议的工作原理以及服务器如何响应客户端请求。在这个项目中,我们使用Java语言来构建一个基本的...

    java实现一个简单的Web服务器实例解析

    本文主要介绍了使用 Java 实现一个简单的 Web 服务器实例解析,分享了相关代码示例。该 Web 服务器使用两个重要的类:java.net.Socket 类和 java.net.ServerSocket 类,并基于发送 HTTP 消息进行通信。本文将详细...

    JAVA100例之实例50 一个简单的Web服务器

    在本实例中,我们将深入探讨如何使用Java编程语言构建一个简单的Web服务器。这个主题涵盖了Java网络编程、HTTP协议的理解以及I/O流的运用等关键知识点。让我们逐一剖析这些概念。 首先,Java网络编程是Java平台的一...

Global site tag (gtag.js) - Google Analytics