使用ServerSocket,模擬B/S服務器,及使用瀏覽器,訪問本身本地的網頁

最近學到了網絡編程,有個練習:
模擬BS服務器
模擬網站服務器,使用瀏覽器訪問本身編寫的服務端程序,查看網頁效果。
踩了兩個坑,就是:html

  • ①HTTPS,不能用這個協議,來訪問,由於這玩意是加密了的,一開始我還覺得它傳的不是UTF-8,由於我用的IDEA,默認UTF-8,我還用InputStreamReader去轉換,可是發現無法,後來,忽然想起了,HTTPS是加密的,而後用HTTP試了,就能夠了。
  • ②網站輸入的地址,能夠用絕對路徑,也可用相對路徑,相對路徑是相對於咱們寫的服務端類的項目位置好比個人服務端: 咱們的地址就要這樣輸入:
  • http://localhost:8888/Advanced/src/Net/BSTCP/web/index.html

(15)4L~J0~R(92LYVW27ZTY.png

注意事項:java

  • ①這個是HTTP的響應頭是固定的格式,須要注意:
    Http響應頭要固定:
  • ②谷歌看不了,建議換其餘瀏覽器看。web

    // 寫入HTTP協議響應頭,固定寫法
      os.write("HTTP/1.1 200 OK\r\n".getBytes());
      os.write("Content‐Type:text/html\r\n".getBytes());
      // 必需要寫入空行,不然瀏覽器不解析
      os.write("\r\n".getBytes());

寫代碼思路編程

  1. 客戶端是網站,咱們只寫服務端
  2. 須要寫兩個服務端,一個是向客戶端發送html代碼,一個是發送圖片
  3. 創建鏈接時,須要使用HTTP協議,而不能使用HTTPS協議,這個協議被加密了,因此客戶端只能輸出加密的請求頭。
  4. 服務端的執行步驟:瀏覽器

    1. 先建立ServerSocket,監聽請求,接收到了,就使用accept( )捕獲。
    2. 利用網絡輸入流,讀取客戶端請求頭,而後獲取Get請求,其中的文件地址。
    3. 處理地址格式
    4. 使用本地文件流,讀取文件,並向客戶端輸出
    5. 在建立一個傳輸照片的服務端,與傳輸html的服務端代碼幾乎同樣,差異在於,傳輸照片服務端,要一直監聽請求,由於他傳輸的不是一張照片
    6. 優化:
      使用多線程,加快傳輸效率

下面放出所有代碼:
html服務端:服務器

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
//http://localhost:8888/Advanced/src/Net/BSTCP/web/index.html HTTP/1.1
//不能使用https,加密協議
public class Server {
    public static void main(String[] args) throws IOException {
        System.out.println("服務端啓動,等待鏈接。。。。");
        //建立一個服務器ServerSocket,和系統要指定的端口號
        ServerSocket server = new ServerSocket(8888);
        //使用accept方法獲取到請求的客戶端對象(瀏覽器)
        Socket socket = server.accept();
        //使用Socket對象中的方法getInputStream,獲取到網絡字節輸入流InputStream對象
        InputStream is = socket.getInputStream();

        //輸出客戶端的請求
        /*byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        System.out.println("cao");*/

        //把is字節流,轉換成字符流,而且使用緩衝流讀取
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        //讀取第一行GET請求的內容
        String s = br.readLine();
        //按空格把它分開
        String[] s1 = s.split(" ");
        //把前面的"/"給排除,使用字符串的截取
        String path = s1[1].substring(1);
        System.out.println(path);

        //建立一個fis流,讀取本地的index.html文件
        FileInputStream fis = new FileInputStream(path);
        //獲取網絡輸出流OutputStream,向客戶端輸出頁面
        OutputStream os = socket.getOutputStream();

        // 寫入HTTP協議響應頭,固定寫法
        os.write("HTTP/1.1 200 OK\r\n".getBytes());
        os.write("Content‐Type:text/html\r\n".getBytes());
        // 必需要寫入空行,不然瀏覽器不解析
        os.write("\r\n".getBytes());

        //向客戶端輸出
        byte bytes[] = new byte[1024];
        int len = 0;
        while((len = fis.read(bytes))!=-1){
            os.write(bytes);
        }
        //關閉資源
        fis.close();
        br.close();
        socket.close();

    }
}

照片服務端網絡

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ImageServer {
    public static void main(String[] args) throws IOException {
        System.out.println("服務端啓動,等待鏈接。。。。");
        //建立一個服務器ServerSocket,和系統要指定的端口號
        ServerSocket server = new ServerSocket(8888);
        while (true){
            //使用accept方法獲取到請求的客戶端對象(瀏覽器)
            Socket socket = server.accept();
            //使用Socket對象中的方法getInputStream,獲取到網絡字節輸入流InputStream對象
            InputStream is = socket.getInputStream();

            //輸出客戶端的請求
            /*byte[] bytes = new byte[1024];
            int len = is.read(bytes);
            System.out.println(new String(bytes,0,len));
            System.out.println("cao");*/

            //多線程,加快傳輸速度
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        //把is字節流,轉換成字符流,而且使用緩衝流讀取
                        BufferedReader br = new BufferedReader(new InputStreamReader(is));

                        //讀取第一行GET請求的內容
                        String s = br.readLine();
                        //按空格把它分開
                        String[] s1 = s.split(" ");
                        //把前面的"/"給排除,使用字符串的截取
                        String path = s1[1].substring(1);
                        System.out.println(path);

                        //建立一個fis流,讀取本地的index.html文件
                        FileInputStream fis = new FileInputStream(path);
                        //獲取網絡輸出流OutputStream,向客戶端輸出頁面
                        OutputStream os = socket.getOutputStream();

                        // 寫入HTTP協議響應頭,固定寫法
                        os.write("HTTP/1.1 200 OK\r\n".getBytes());
                        os.write("Content‐Type:text/html\r\n".getBytes());
                        // 必需要寫入空行,不然瀏覽器不解析
                        os.write("\r\n".getBytes());

                        //向客戶端輸出
                        byte bytes[] = new byte[1024];
                        int len = 0;
                        while((len = fis.read(bytes))!=-1){
                            os.write(bytes);
                        }
                        //關閉資源
                        fis.close();
                        br.close();
                        socket.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }).start();


        }

    }
}
相關文章
相關標籤/搜索