文件服务器

  用java实现了一个很简单的基于HTTP协议的文件服务器。服务器指定一个根目录,客户端可以显示并下载根目录下的所有文件。

  客户端用浏览器进行连接,输入地址:http://服务器IP地址:8080就可以连接到服务器端。

     实现步骤:

  1 获取客户端连接,交给新线程处理;

  2 获取http报文请求行,然后获取方法和URL。

    如果字符串用空格作为分隔符,可以用

      StringTokenizer st=new StringTokenizer(str),

           然后用

      st.nextToken()来获得一个字符串。

           用

                 st.countTokens()可以获得子字符串数目。“0”表示原字符串是空,“1”表示没有空格。

         对URL进行解码。中文URL在解码之前会显示一大堆百分号,解码后能正确显示中文名称目录或下载中文名称文件。

           方法:使用String str=java.net.URLDecoder.decode(URL_str,"UTF-8");

      3 如果URL是目录,显示目录;如果URL是文件,传送文件;

      4 关闭。

 1 import java.io.*;
2 import java.net.*;
3 import java.util.ArrayList;
4 import java.util.Iterator;
5
6 public class FileServer {
7 static int portNum=8080;
8 static int counter=0;
9 //设置根目录。
10 static String directory="E:/";
11 public static void main(String[] args) throws IOException, InterruptedException{
12 ServerSocket server_socket=new ServerSocket(portNum);
13 System.out.println("Server has been started:"+server_socket);
14 ArrayList<RequestHandler> list=new ArrayList<RequestHandler>();
15 while(counter<100){
16 Socket socket= server_socket.accept();
17 System.out.println("Accept the client:"+socket);
18 RequestHandler thread=new RequestHandler(socket,directory);
19 thread.start();
20 list.add(thread);
21 counter++;
22 }
23 server_socket.close();
24 System.out.println("Server has been closed");
25 Iterator<RequestHandler> it=list.iterator();
26 while(it.hasNext()){
27 RequestHandler t=(RequestHandler) it.next();
28 t.join();
29 }
30 }
31 }

 

 1 import java.io.*;
2 import java.net.*;
3 import java.util.Arrays;
4 import java.util.StringTokenizer;
5
6 public class RequestHandler extends Thread{
7 Socket socket;
8 BufferedReader in;
9 PrintStream out;
10 String directory=null;
11 RequestHandler(Socket socket,String directory) throws IOException{
12 this.socket=socket;
13 in=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
14 out=new PrintStream(socket.getOutputStream(),true);
15 this.directory=directory;
16 }
17 public void run() {
18 String request_name=null;
19 try{
20 while(true){
21 String headline=in.readLine();
22 if(headline==null||headline.equals("\r\n"))
23 break;
24 StringTokenizer st=new StringTokenizer(headline);
25 if(st.countTokens()==0)
26 break;
27 if(st.nextToken().equals("GET")){
28 System.out.println("Received: "+headline);
29 request_name=st.nextToken();
30 }
31 }
32 handle(request_name);
33
34 socket.close();
35 }catch(IOException e){
36 System.out.println("Error!");
37 e.printStackTrace();
38 }
39
40 }
41 void handle(String rqname) throws IOException{
42 System.out.println(rqname);
43 if(rqname==null) return;
44      //用UTF-8解码URL
45 rqname=new String(java.net.URLDecoder.decode(rqname,"UTF-8"));
46 System.out.println("Filename:"+rqname);
47 File f=new File(directory+rqname);
48      //判断是不是目录。
49 if(!f.isDirectory()){
50 //判断文件是不是存在。
51 if(f.exists())
52 sendFile(f);
53 else{
54 out.println("HTTP/1.1 404 Not Found");
55 out.println("connection:keep-alive");
56 out.println();
57 }
58 }
59 else{
60 printDirectory(f,rqname);
61 }
62 }
63 void sendFile(File f) throws IOException{
64 out.println("HTTP/1.1 200 OK");
65 out.println("connection:keep-alive");
66 out.println();
67 //使用缓冲区传输文件。
68 int BUFFER_SIZE=1024*8;
69 byte buffer[]=new byte[BUFFER_SIZE];
70 FileInputStream fis=new FileInputStream(f);
71 int length=-1;
72 while((length=fis.read(buffer,0,BUFFER_SIZE))!=-1){
73 out.write(buffer,0,length);
74 }
75
76 }
77 void printDirectory(File dir,String rqname){
78 out.println("HTTP/1.1 200 OK");
79 out.println("connection:keep-alive");
80 out.println();
81 out.println("<HTML><TITLE>"+dir.getName()+"</TITLE><Hl>目录<Hl>");
82 String list[]=dir.list();
83 Arrays.sort(list);
84 int length=list.length;
85 for(int i=0;i<length;i++){
86 //显示目录并提供超链接使客户端能够浏览或下载下一级内容。
87 if(rqname.equals("/"))
88 out.print("<BR><a href="+list[i]+">"+list[i]+"</a>");
89 else
90 out.print("<BR><a href="+rqname+"/"+list[i]+">"+list[i]+"</a>");
91 }
92 out.println("</html>");
93 directory=dir.getName();
94 }
95 }



转载于:https://www.cnblogs.com/abcturbo/archive/2012/02/10/FileServer.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值