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

自己写的简单的webServer,Java

阅读更多

前段时间进一步了解webServer,因此听老大的话,自己实现了一个。
代码如下

 

WebServer类

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class WebServer {
	public static void main(String[] args) throws IOException {

		ExecutorService pool = Executors.newFixedThreadPool(4);
		ServerSocket ss = new ServerSocket(MyServ.HTTPPORT);
		ss.setReuseAddress(true);

		System.out.println("start...");
		while (true) {
			Socket socket = ss.accept();
			System.out.println("Thread #" + MyServ.count);
			pool.execute(new MyServ(socket));
		}
	}
}

 MyServ类

import java.io.*;
import java.net.Socket;
import java.util.Random;
import java.util.concurrent.locks.ReentrantLock;

public class MyServ implements Runnable {

	public static int count = 0; // 线程计数器
	private static Random random = new Random(123);
	private static ReentrantLock lock = new ReentrantLock(); // 重入锁

	public static int HTTPPORT = 801;
	private static String HOSTPATH = "D:/temp";
	private static String ERRORPAGE = "/error.html";

	private Socket socket;

	public MyServ(Socket socket) {
		this.socket = socket;
	}

	/**
	 * HTTP响应
	 * 
	 * @param out
	 * @param request
	 */
	private void responseHTTP(PrintStream out, RequestZq request) {
		File file = new File(HOSTPATH + request.getURI());

		if (file.isDirectory()) {
			autoGenerateBody(out, request, file);
			return;
		}

		String response = getResponseHead(request);
		// System.out.println(response.toString());
		out.println(response.toString());
		out.flush();
		if (response.contains("404")) {
			transferFile(out, HOSTPATH + ERRORPAGE);
		} else {
			transferFile(out, file.getPath());
		}
	}

	private void autoGenerateBody(PrintStream out, RequestZq request, File file) {
		StringBuffer response = new StringBuffer();
		response.append(request.getReqVersion() + " 200 OK\r\n");
		response.append("Content_Type:text/html");
		System.out.println(response.toString());
		out.println(response.toString());
		out.println();
		String[] list = file.list();
		if (list.length == 0)
			out.println("无文件");
		else {
			response = new StringBuffer();
			response.append("<html><head><title>Directory</title></head><body><ul>");
			for (int i = 0; i < list.length; i++) {
				File f = new File(file.getAbsolutePath() + "/" + list[i]);
				String path = f.getAbsolutePath();
				int idx = path.indexOf(HOSTPATH) + HOSTPATH.length() + 1;
				response.append("<li><a href=\""
						+ path.substring(idx).replace('\\', '/') + "\">"
						+ list[i] + "</a></li>");
			}
			response.append("</ul></body></html>");
			//System.out.println(response.toString());
			out.println(response.toString());
		}
		out.flush();

	}

	/**
	 * 获得HTTP的报文头
	 * 
	 * @param request
	 * @return
	 */
	private String getResponseHead(RequestZq request) {
		StringBuffer response = new StringBuffer();
		File file;
		String filepath = HOSTPATH + request.getURI();
		int idx = request.getURI().lastIndexOf(".");
		System.out.println(">>filePath = " + filepath);
		file = new File(filepath.toString());
		if (!file.exists() || idx == -1) {
			response.append(request.getReqVersion() + " 404 Not Found\r\n");
			return response.toString();
		}
		response.append(request.getReqVersion() + " 200 OK\r\n");
		response.append("Content_Type:");
		String type = request.getURI().substring(idx + 1,
				request.getURI().length());
		if ("jpg|png|gif|jpeg|bmp".contains(type)) {
			response.append("image/" + type);
		} else if ("shtml".contains(type)) {
			response.append("text/html; charset=GBK");
		} else {
			response.append("error");
		}
		response.append("\r\n");
		response.append("Content_Length:" + (file.length() + 2) + "\r\n");
		return response.toString();
	}

	/**
	 * 传输http报文body
	 * 
	 * @param request
	 */
	private void transferFile(PrintStream out, String filepath) {
		File file = new File(filepath);
		int len = (int) file.length() + 1;
		try {
			FileInputStream fs = new FileInputStream(file);
			byte[] buf = new byte[len];
			fs.read(buf);

			out.write(buf);
			out.flush();
			fs.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		BufferedReader in = null;
		PrintStream out = null;
		increaseCount();

		try {
			in = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			out = new PrintStream(socket.getOutputStream());

			RequestZq request = null;
			String reqStr = null;
			// GET /xx HTTP/1.1
			reqStr = in.readLine()+"\n";
			request = new RequestZq(reqStr);
			System.out.println(reqStr);

			this.responseHTTP(out, request);
			in.close();
			out.close();
			socket.close();
			socket = null;
			/*
			 * int curCount = getCount(); int i= 10; while (--i>0) {
			 * Thread.sleep(random.nextInt()%1000+1000);
			 * System.out.print(curCount); }
			 * System.out.println("\n------out: "+curCount); catch
			 * (InterruptedException e) { e.printStackTrace(); }
			 */
		} catch (IOException e) {
			System.out.print(e.getMessage());
		}
	}

	private int getCount() {
		int ret = 0;
		try {
			lock.lock();
			ret = count;
		} finally {
			lock.unlock();
		}
		return ret;
	}

	private void increaseCount() {
		try {
			lock.lock();
			++count;
		} finally {
			lock.unlock();
		}
	}
}

 RequestZq类

public class Factory {
	private static Factory fac = null;

	private Factory() {
	}

	public Factory getInstance() {
		synchronized (this) {
			if (fac == null) {
				fac = new Factory();
			}
		}
		return fac;
	}
	public RequestZq getRequest(String req){
		return new RequestZq(req);
	}
}

 Factory类

public class Factory {
	private static Factory fac = null;

	private Factory() {
	}

	public Factory getInstance() {
		synchronized (this) {
			if (fac == null) {
				fac = new Factory();
			}
		}
		return fac;
	}
	public RequestZq getRequest(String req){
		return new RequestZq(req);
	}
}
 
分享到:
评论

相关推荐

    vb6 调用java WEBSERVER

    一个调用JAVA的WEBSERVER方法实例,用VB6写的,简单明了

    http1.0 web server & client(JAVA)

    使用http1.0协议,实现一个非常简单的http web server和client

    JavaServer Pages (JSP)

    JavaServer Pages (JSP) 技术提供了一种简单快速的方法来创建显示动态生成内容的 Web 页面。由业界处于领先地位的 Sun 公司制定了相关的 JSP 技术规范,该规范定义了如何在服务器和 JSP 页面间进行交互,还描述了...

    http.rar_HTTP java_http server java_java http_java web simple

    一个用java写的简单的WEB服务器和浏览器,对于相关的学习者有点帮助,可以初步了理一下整个模型的编写

    java源码包---java 源码 大量 实例

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    基于Java的RTSP服务源码

    基于java的RTSP服务,支持RTP/UDP和RTP/TCP模式的VLC播放源码

    Java源码包100个设计实例.zip

    Java开发的简单WEB服务器源码.rar Java数据压缩与传输实例 Java数组倒置 Java日期选择控件完整源代码.rar Java机车狂飙源代码.rar Java模仿的MSN聊天软件.rar java模拟掷骰子2个 Java毕业论文:搜索引擎系统附源代码...

    java源码包4

    第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时...

    java源码包3

    第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时...

    JAVA上百实例源码以及开源项目

    第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包2

    第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...

    java web 电子书店系统

    在myeclipse中运行的一个简单的小程序,数据库使用sql server 2005,适合初学者使用。

    Java Web实现登陆注册页面前端与后台数据连接(代码+sql文件)

    Java Web实现登陆注册页面前端与后台数据连接(代码+sql文件)。Java Web实现登陆注册页面前端与后台数据连接(代码+sql文件)。Java Web实现登陆注册页面前端与后台数据连接(代码+sql文件)。

    Web开发+java+ssh框架

    Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中 取代CMP,完成数据持久化的重任。 大多数...

    Java服务器程序设计

    3.1 java web server的安装与启动[/font] 3.1.1 在windows 95或windows nt上安装[/font] 3.1.2 在unix上安装[/font] 3.1.3 java server环境变量的设置[/font] 3.1.4 启动java server[/font] 3.1.5 在端口80上启动...

    java jdk实列宝典 光盘源代码

    applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容java的web浏览器中运行的程序;...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...

Global site tag (gtag.js) - Google Analytics