前段时间进一步了解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);
}
}
分享到:
相关推荐
一个调用JAVA的WEBSERVER方法实例,用VB6写的,简单明了
使用http1.0协议,实现一个非常简单的http web server和client
JavaServer Pages (JSP) 技术提供了一种简单快速的方法来创建显示动态生成内容的 Web 页面。由业界处于领先地位的 Sun 公司制定了相关的 JSP 技术规范,该规范定义了如何在服务器和 JSP 页面间进行交互,还描述了...
一个用java写的简单的WEB服务器和浏览器,对于相关的学习者有点帮助,可以初步了理一下整个模型的编写
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
基于java的RTSP服务,支持RTP/UDP和RTP/TCP模式的VLC播放源码
Java开发的简单WEB服务器源码.rar Java数据压缩与传输实例 Java数组倒置 Java日期选择控件完整源代码.rar Java机车狂飙源代码.rar Java模仿的MSN聊天软件.rar java模拟掷骰子2个 Java毕业论文:搜索引擎系统附源代码...
第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时...
第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时...
第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第三步:在登陆后的界面文本框输入文本,然后发送 可以同时...
将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...
在myeclipse中运行的一个简单的小程序,数据库使用sql server 2005,适合初学者使用。
Java Web实现登陆注册页面前端与后台数据连接(代码+sql文件)。Java Web实现登陆注册页面前端与后台数据连接(代码+sql文件)。Java Web实现登陆注册页面前端与后台数据连接(代码+sql文件)。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中 取代CMP,完成数据持久化的重任。 大多数...
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上启动...
applications和applet,applications可以在控制台直接运行,与其他高级编程语言没有太大区别,而java的特色在于它具有编制小应用程序的功能,applet可以在internet上传输并在兼容java的web浏览器中运行的程序;...
将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...