最近學到了網絡編程,有個練習:
模擬BS服務器
模擬網站服務器,使用瀏覽器訪問本身編寫的服務端程序,查看網頁效果。
踩了兩個坑,就是:html
相對於咱們寫的服務端類的項目位置
好比個人服務端: 咱們的地址就要這樣輸入:
注意事項:java
②谷歌看不了,建議換其餘瀏覽器看。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());
寫代碼思路編程
須要使用HTTP協議,而不能使用HTTPS協議
,這個協議被加密了,因此客戶端只能輸出加密的請求頭。服務端的執行步驟:瀏覽器
要一直監聽請求,由於他傳輸的不是一張照片
使用多線程,加快傳輸效率
下面放出所有代碼:
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(); } } }