<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    BinCat V1 - 簡單的請求文件訪問處理

    BinCat V1 - 簡單的請求文件訪問處理

    實現一個簡單的Web服務器非常容易,使用ServerSocket在服務器端監聽端口并等待瀏覽器請求,一旦接收到瀏覽器數據后就開始解析Http協議,最后將服務器端請求處理完后通過Socket返回給瀏覽器即可。

    image-20200909171226930

    V1版本,我們先實現一個簡單的讀取服務器靜態文件的功能,在后續版逐漸完善。

    BinCatServerV1實現代碼:

    package com.anbai.sec.server;
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.logging.Logger;
    
    /**
     * ServerSocket示例
     */
    public class BinCatServerV1 {
    
        private static final Logger LOG = Logger.getLogger("info");
    
        public static void main(String[] args) {
            try {
                // 設置服務監聽端口
                int port = 8080;
    
                // 設置服務名稱
                String serverName = "BinCat-0.0.1";
    
                // 創建ServerSocket,監聽本地端口
                ServerSocket ss = new ServerSocket(port);
    
                LOG.info(serverName + " 啟動成功,監聽端口: " + port);
    
                while (true) {
                    // 等待客戶端連接
                    Socket socket = ss.accept();
    
                    try {
                        // 獲取Socket輸入流對象
                        InputStream in = socket.getInputStream();
    
                        // 獲取Socket輸出流對象
                        OutputStream out = socket.getOutputStream();
    
                        // 創建輸出流對象
                        BufferedReader br = new BufferedReader(new InputStreamReader(in));
    
                        // 從Socket中讀取一行數據
                        String str = br.readLine();
    
                        if (str == null) {
                            continue;
                        }
    
                        // 切割請求Http協議信息
                        String[] strs = str.split("\\s+");
    
                        // 解析Http請求URL地址
                        String url = strs[1];
    
                        // 輸出服務器返回信息
                        String msg = "";
    
                        // 當前服務器運行目錄下的文件
                        File file = new File(System.getProperty("user.dir"), url);
    
                        if (file.exists()) {
                            out.write("HTTP/1.1 200 OK\n".getBytes());
                            msg = file.getAbsolutePath();
                        } else {
                            out.write("HTTP/1.1 404 Not Found\n".getBytes());
                            msg = file.getAbsolutePath() + " Not Found!";
                        }
    
                        // 輸出返回字節數
                        out.write(("Content-Length: " + msg.getBytes().length + "\n").getBytes());
    
                        // 寫入換行
                        out.write("\n".getBytes());
    
                        // 將讀取到的數據寫入到客戶端Socket
                        out.write(msg.getBytes());
    
                        in.close();
                        out.close();
                    } catch (IOException e) {
                        LOG.info("處理客戶端請求異常:" + e);
                    } finally {
                        socket.close();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }

    啟動BinCat服務后控制臺將輸出:

    九月 09, 2020 5:18:50 下午 com.anbai.sec.server.BinCatServerV1 main
    信息: BinCat-0.0.1啟動成功,監聽端口:8080

    瀏覽器請求localhost:8080即可在瀏覽器中輸出當前請求的文件是否存在:

    image-20200909172152042

    請求一個不存在的文件地址,瀏覽器將會輸出錯誤信息,如請求localhost:8080/test

    image-20200909213525425

    從上圖中我們可以看到響應的狀態碼和body都能夠正確的被瀏覽器解析。

    本文章首發在 網安wangan.com 網站上。

    上一篇 下一篇
    討論數量: 0
    只看當前版本


    暫無話題~
    亚洲 欧美 自拍 唯美 另类