java核心類庫——網路程式設計
一:概述:
1.網路常識:
2.網路程式設計協議:
(A B為友軍,C為敵軍,A告訴B要去攻打C,流程:1)A排探子去給C說這件事 2)C將A的探子留下,派出自己的探子到A去確認 3)A講到C的探子,然後讓C的探 子回到C 4)C見自家的探子回來了,確認訊息可靠,將A的探子放回去)
TCP通過這種連線協議,就很安全
3.
瀏覽器與伺服器:優點:通過伺服器可以及時的對版本進行跟新 缺點:不得不遵守瀏覽器創造的的規定,而且會造成資料洩露
客戶端與伺服器:優點:因為都是自己操控的,所以在修改版本的時候就很自由,安全。 缺點:只要使用者不主動更新版本,伺服器更新的內容客戶端無法實現
4.
.
OSI模型:舉個栗子:你通過QQ發訊息,就會經過應用層,到下一個層,直到物理層,然後經過網線,發生出去
四次揮手:1)A對C說,二弟我要走了,
2)C對A說,大哥你確定,
3)A對C說,我確定,
4)C對A說,好的再見。
二:學習兩個類(來搭建 服務端-ServerSocket 和 客戶端-Socket)
1.Socket是兩臺計算機之間通訊的端點,是網路驅動提供給應用程式程式設計的一種介面,一套標準,一套機制。
2.工作流程:客戶端通過ServerSocket和服務端建立一個練習,服務端也會返回一個Socket物件,然後兩個Socket之間就可以進行通訊。
3.網路程式設計,一定是現有伺服器,然後我們客戶端採取連線伺服器(以後網路程式設計一定有兩個主方法,一個是服務端,一個是客戶端,先執行服務端,在執行客戶端)
4.ServerSocket和Socket構造方法,和一些相關的內容。
5.
5.1)程式碼演示:(一定要先啟動伺服器,等待客戶端連線,然後在啟動客戶端,客戶端的啟動可以出發伺服器執行任務)
我是伺服器:1 import java.io.IOException;
2 import java.net.ServerSocket; 3 4 public class Test01 { 5 /** 6 * 我是伺服器7 * @param args 8 */ 9 public static void main(String[] args) throws IOException { 10 //搭建伺服器 11 ServerSocket socket = new ServerSocket(10008); 12 System.out.println("伺服器搭建完成"); 13 //等待客戶端連線,只有當客戶端連線上伺服器後,伺服器才會執行後面的程式碼。
14 Socket socket = socket.accept(); 15 System.out.println("一個客戶端連線了"); 16 System.out.println("伺服器執行結束"); 17 } 18 }
我是客戶端:
1 import java.io.IOException; 2 import java.net.Socket; 3 4 public class Test02 { 5 /** 6 * 我是客戶端 7 * @param args 8 */ 9 public static void main(String[] args) throws IOException { 10 //建立客戶端物件 11 Socket socket = new Socket("localhost",10008); 12 13 }
5.2)建立完成之後,如何進行交流呢:建立聯絡之後,服務端和客戶端都有了一個Socket物件,通過這個物件可以去呼叫輸入輸出流物件來進行訊息的交流
5.3)程式碼演示:
伺服器給客戶端寫訊息
1 import java.io.IOException; 2 3 import java.io.OutputStream; 4 import java.io.PrintStream; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 public class Test01 { 9 /** 10 * 我是伺服器 11 * @param args 12 */ 13 public static void main(String[] args) throws IOException { 14 //搭建伺服器 15 ServerSocket serversocket = new ServerSocket(10008); 16 System.out.println("伺服器搭建完成"); 17 //等待客戶端連線 18 Socket socket = serversocket.accept(); 19 System.out.println("一個客戶端連線了"); 20 /** 21 * 現在我要給客戶端發訊息 22 */ 23 //1.獲取一個輸出流 24 OutputStream os = socket.getOutputStream(); 25 //2.將輸入流轉換為一個列印流 26 PrintStream ps = new PrintStream(os); 27 //3.呼叫方法,列印 28 ps.println("客戶端你好,歡迎連線本伺服器"); 29 System.out.println("伺服器執行結束"); 30 }
客戶端接收伺服器傳來的訊息
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.net.Socket; 6 7 public class Test02 { 8 /** 9 * 我是客戶端 10 */ 11 public static void main(String[] args) throws IOException { 12 //建立客戶端物件 13 Socket socket = new Socket("localhost", 10008); 14 /** 15 * 接收來自伺服器的訊息 16 */ 17 //1.建立輸入流 18 InputStream ps = socket.getInputStream(); 19 //2.採用一次讀一句 20 BufferedReader br = new BufferedReader(new InputStreamReader(ps)); 21 String text = br.readLine(); 22 System.out.println(text); 23 } 24 }
重點:伺服器與客戶端的交流是互相的,必須一次輸出對應一個輸入,這樣才不會卡死。
6.在伺服器中新增多執行緒
6.1)一個伺服器肯定是要連線很多客戶端的,這個時候需要在迴圈中建立一個子執行緒,來執行每個客戶端與伺服器的連線。
6.2)程式碼演示:(再次強調,客戶端和服務端的輸入輸出是交叉的一個輸入對應一個輸出,不然會執行緒卡死)
1 import java.io.OutputStream; 2 import java.io.PrintStream; 3 import java.net.ServerSocket; 4 import java.net.Socket; 5 6 public class Test01 { 7 /** 8 * 我是伺服器 9 * 10 * @param args 11 */ 12 public static void main(String[] args) throws IOException { 13 //搭建伺服器 14 ServerSocket serversocket = new ServerSocket(10008); 15 while (true) { 16 //等待客戶端連線 17 Socket socket = serversocket.accept(); 18 //客戶端連線後就建立一個執行緒,讓他同該客戶端交流 19 new Thread() { 20 @Override 21 public void run() { 22 try { 23 //1.建立輸出流 24 OutputStream outputStream = socket.getOutputStream(); 25 //2.將輸出流轉換為列印流 26 PrintStream ps = new PrintStream(outputStream); 27 ps.println("客戶端,你好呀"); 28 } catch (IOException e) { 29 e.printStackTrace(); 30 } 31 32 } 33 }.start(); 34 } 35 } 36 }
7.
8.
總結:
網路程式設計只要是TCP協議,主流,其他的很少用,要用的時候在看下吧。
加油吧!