直接上代码:
package com.test.monkey;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 设计一个服务器,支持浏览器
* socket
* 返回相应(IO流)
* @param args
* @throws IOException
*/
public class tomMonkey {
/**
* 默认端口
*/
private static int PORT=8080;
/**
* 程序启动方法
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
System.out.println(args.length);
//可以动态设置服务器的端口
int p = (args.length>0)?Integer.parseInt(args[0]):PORT;
new tomMonkey().start(p);
}
/**
* 启动服务
* 创建socket服务器
* @throws IOException
*/
public void start(int port) throws IOException{
ServerSocket ss = new ServerSocket(port); //监听端口
System.out.println("-----监听"+port+"端口-----");
while(true){
Socket socket = ss.accept();
System.out.println("-----------客户端请求-----------");
//new Thread(new HandleRequestThread(socket));
//创建线程池
ExecutorService pool = Executors.newFixedThreadPool(100); //设置线程池最多并发访问量100
//将任务交给线程池处理
pool.submit(new HandleRequestThread(socket));
}
}
}
package com.test.monkey;
import java.beans.beancontext.BeanContext;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.nio.Buffer;
import javax.management.loading.PrivateClassLoader;
public class HandleRequestThread implements Runnable{
private InputStream in = null;//输入流
private PrintStream out = null;//输出流
//对应的资源路径
public static final String WEB_ROOT = "D:"+File.separator+"MyWeb"+File.separator;
/**
* 通过构造器获取socket
* 并通过socket获取对客户端的输入流和输出流
* @param socket
*/
public HandleRequestThread(Socket socket){
try {
in = socket.getInputStream();
out = new PrintStream(socket.getOutputStream()); //输出流
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 解析请求头,获得客户端请求的资源名称
* @param in 客户端输入流
* @return
* @throws IOException
*/
public String parseReauestHead(InputStream in ) throws IOException{
//客户端发送的请求会把一些请求数据包含在请求头中.....
BufferedReader bReader = new BufferedReader(new InputStreamReader(in));
//读取请求头中的第一行包含请求的方式,请求的资源名称,请求的协议版本...
String headConnent = bReader.readLine();
//数据使用空格分隔的
System.out.println(headConnent);
//获取部分数据
String[] heads = headConnent.split(" ");
System.out.println(heads[1]);
return heads[1];
}
public void GetFile(String fileName) throws IOException{
File file = new File(WEB_ROOT+fileName);
if(!file.exists()){
System.out.println("资源不存在");
return;
}
System.out.println(file.toString());
try {
BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file));
byte[] buffer = new byte[(int) file.length()];
int len = bis.read(buffer);
out.println("HTTP/1.1 200 ok");
out.println();
out.write(buffer);
out.flush();
out.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
String fileName = parseReauestHead(this.in);
GetFile(fileName);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
然后在我本地机器上的D盘,新建一个文件夹叫做MyWeb,然后放一张图片,名叫:test.jpg
输入浏览地址:http://localhost:8080/test.jpg
ok:结果:
大功告成!! 当然这只是简单的模拟一下访问应用程序资源的一个小小的服务器! 如果还要考虑并发,性能,安全,缓存的话肯定还要下很大的功夫。。