<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    俊星的BLOG

    我的簡單HTTP服務(wù)器

    在BLOGJAVA上看到一篇關(guān)于HTTP SERVER的簡單實現(xiàn),博文網(wǎng)址為:http://www.tkk7.com/beansoft/archive/2007/06/25/126049.html
    關(guān)于HTTP 協(xié)議更多信息,請參考:WIKIRFC2616。下面我的實現(xiàn):
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.URLDecoder;

    /**
     * 簡單HTTP服務(wù)器
     * 
     * 
    @author kinkding
     
    */
    public class MyHTTPServer implements Runnable {
        ServerSocket server;
        
    int port = 80;

        
    public MyHTTPServer() throws IOException {
            server 
    = new ServerSocket(port);
            
    new Thread(this).start();
            System.out.println(
    "HTTP服務(wù)器已經(jīng)啟動");
        }

        
    public void run() {
            
    while (true) {
                
    try {
                    Socket client 
    = server.accept();
                    System.out.println(
    "接收到客戶端:" + client);
                    BufferedReader reader 
    = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    System.out.println(
    "請求內(nèi)容如下:\n---------------------");
                    String line 
    = reader.readLine();
                    System.out.println(line);
                    
    // 請求的資源
                    String resource = line.substring(line.indexOf("/"), line.lastIndexOf("/"- 5);
                    resource 
    = URLDecoder.decode(resource, "UTF-8");
                    
    // 請求方法:GET/POST
                    String method = line.split(" ")[0];
                    
    int length = 0;
                    
    while ((line = reader.readLine()) != null && line.length() > 0) {
                        
    if (line.startsWith("Content-Length"&& length == 0) {
                            length 
    = Integer.parseInt(line.substring(line.indexOf(":"+ 1).trim());
                        }
                        System.out.println(line);
                    }
                    System.out.println(
    "---------------------");
                    String postData 
    = "";
                    
    if (method.equals("POST"&& length > 0) {
                        
    char cbuf[] = new char[length];
                        reader.read(cbuf, 
    0, length);
                        postData 
    = new String(cbuf);
                    }
                    
    if (resource.endsWith(".jpg")) {
                        
    this.sendFile("happyTime.jpg", client);
                        client.close();
                    } 
    else if (resource.endsWith(".do")) {
                        
    // 返回404
                        PrintWriter out = new PrintWriter(client.getOutputStream(), true);
                        out.println(
    "HTTP/1.0 404 Not found");
                        out.println();
                        out.close();
                    } 
    else {
                        PrintWriter out 
    = new PrintWriter(client.getOutputStream(), true);
                        out.println(
    "HTTP/1.0 200 OK");
                        out.println(
    "Content-Type:text/html;charset=GBK");
                        out.println();
    // HTTP協(xié)議:空行表示信息結(jié)束

                        out.println(
    "<UL>");
                        out.println(
    "<LI>Hello World");
                        out.println(
    "<LI><img src='anyJPG.jpg'/>");
                        out.println(
    "<LI>resource:" + resource);
                        out.println(
    "<LI>method:" + method);
                        out.println(
    "<LI><a href='foobar.do'>foobar.do</a>");
                        out.println(
    "</UL>");
                        
    // 測試POST
                        out.println("<form method='post' action='/'>");
                        out.println(
    "<input type='text' name='name' value=''/>");
                        out.println(
    "<input type='submit' value='POST'/>");
                        out.println(
    "POST DATA:" + postData);
                        out.println(
    "</form>");
                        
    // 測試GET
                        out.println("<form method='get' action='/'>");
                        out.println(
    "<input type='text' name='job' value=''/>");
                        out.println(
    "<input type='submit' value='GET'/>");
                        out.println(
    "</form>");

                        out.close();
                        client.close();
                    }

                } 
    catch (Exception e) {
                    
    // TODO: handle exception
                    e.printStackTrace();
                }
            }
        }

        
    private void sendFile(String name, Socket client) throws IOException {
            PrintStream out 
    = new PrintStream(client.getOutputStream(), true);
            File fileToSend 
    = new File(name);
            
    if (fileToSend.exists() && !fileToSend.isDirectory()) {
                out.println(
    "HTTP/1.0 200 OK");
                out.println(
    "Content-Type:application/binary");
                out.println(
    "Content-Length:" + fileToSend.length());
                out.println();

                FileInputStream fis 
    = new FileInputStream(fileToSend);
                
    byte buf[] = new byte[1024];
                
    int size = 0;
                
    while ((size = fis.read(buf)) > 0) {
                    out.write(buf, 
    0, size);
                }
                out.close();
                fis.close();
            }
        }

        
    public static void main(String[] args) {
            
    try {
                
    new MyHTTPServer();
            } 
    catch (IOException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    運行之后,控制臺的輸出類似如下:
    HTTP服務(wù)器已經(jīng)啟動
    接收到客戶端:Socket
    [addr=/127.0.0.1,port=1198,localport=80]
    請求內(nèi)容如下:
    ---------------------
    GET / HTTP/
    1.1
    Accept: image/gif
    , image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
    Accept-Language: zh-cn
    Accept-Encoding: gzip
    , deflate
    User-Agent: Mozilla/
    4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
    Host: localhost
    Connection: Keep-Alive
    ---------------------
    接收到客戶端:Socket
    [addr=/127.0.0.1,port=1199,localport=80]
    請求內(nèi)容如下:
    ---------------------
    GET /anyJPG.jpg HTTP/
    1.1
    Accept: */*
    Referer: http://localhost/
    Accept-Language: zh-cn
    Accept-Encoding: gzip
    , deflate
    User-Agent: Mozilla/
    4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
    Host: localhost
    Connection: Keep-Alive
    ---------------------
    接收到客戶端:Socket
    [addr=/127.0.0.1,port=1218,localport=80]
    請求內(nèi)容如下:
    ---------------------
    POST / HTTP/
    1.1
    Accept: image/gif
    , image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
    Referer: http://localhost/
    Accept-Language: zh-cn
    Content-Type: application/x-www-form-urlencoded
    Accept-Encoding: gzip
    , deflate
    User-Agent: Mozilla/
    4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
    Host: localhost
    Content-Length: 
    7
    Connection: Keep-Alive
    Cache-Control: no-cache
    ---------------------
    接收到客戶端:Socket
    [addr=/127.0.0.1,port=1231,localport=80]
    請求內(nèi)容如下:
    ---------------------
    GET /?job
    =aaa HTTP/1.1
    Accept: image/gif
    , image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
    Referer: http://localhost/
    Accept-Language: zh-cn
    Accept-Encoding: gzip
    , deflate
    User-Agent: Mozilla/
    4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
    Host: localhost
    Connection: Keep-Alive
    ---------------------

    頁面運行效果類似如下:
     
    另,推薦一個不錯的命令行“netstat -an |find /i "listening" >good.txt”,查看當前處于監(jiān)聽狀態(tài)的IP及端口,并將得到的信息重定向到good.txt中,形如:
      TCP    0.0.0.0:80             0.0.0.0:0              LISTENING
      TCP    
    0.0.0.0:135            0.0.0.0:0              LISTENING
      TCP    
    0.0.0.0:445            0.0.0.0:0              LISTENING
      TCP    
    0.0.0.0:2366           0.0.0.0:0              LISTENING
      TCP    
    0.0.0.0:19771          0.0.0.0:0              LISTENING
      TCP    
    127.0.0.1:1031         0.0.0.0:0              LISTENING

    posted on 2009-05-23 17:51 俊星 閱讀(516) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲精品天堂成人片?V在线播放| 91亚洲一区二区在线观看不卡| 免费手机在线看片| 亚洲第一AV网站| 毛片免费在线观看网址| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 亚洲av高清在线观看一区二区 | 亚洲VA中文字幕无码毛片| 在线永久看片免费的视频| 国产亚洲午夜精品| 久久久亚洲欧洲日产国码是AV| 暖暖日本免费在线视频| 在线毛片片免费观看| 亚洲精品无码久久| 亚洲欧洲一区二区| MM131亚洲国产美女久久| 国产精品久久久久久久久免费| 国产精品福利在线观看免费不卡 | 精品一区二区三区免费| 国产成人+综合亚洲+天堂| 亚洲国产精品自在线一区二区| 免费看少妇作爱视频| 最新国产乱人伦偷精品免费网站| 亚洲GV天堂GV无码男同| 亚洲一区二区中文| 亚洲欭美日韩颜射在线二| 日韩精品视频免费网址| 中文字幕亚洲免费无线观看日本| 日韩在线视频播放免费视频完整版| 2017亚洲男人天堂一| 亚洲Aⅴ无码专区在线观看q| 亚洲AV无码乱码精品国产| 毛色毛片免费观看| 59pao成国产成视频永久免费| 国产区在线免费观看| 337P日本欧洲亚洲大胆精品| 亚洲伊人久久大香线焦| 亚洲专区先锋影音| 亚洲三区在线观看无套内射| 亚洲精品和日本精品| 国产成人精品男人免费|