域名:
DN (Domain name)是由一串由點分隔的名字組成的Internet上某一台計算機或計算機組的名稱。
域名服務系統:DNS:它可以作為將域名和IP地址相互映射的一個分布式數據庫。
協議:
應用層常見協議:
http協議:超文本傳輸語言。
ftp協議:文件傳輸協議
smtp協議:簡單郵件傳輸協議
傳輸層的協議:
UDP協議:用戶數據報協議,面向無連接的,簡單不可靠的傳輸層協議。
- 面向無連接
- 通過數據報包來進行傳輸,每個數據報包大小不會超過64k.
- 不可靠的傳輸。
- 傳輸速度快。
TCP協議:傳輸控制協議,一種面向連接的,可靠的,基於字節流的傳輸層通信協議。
TCP協議傳輸過程:
要經過三次握手,確定通道的連接。
建立流的傳輸通道,進行數據的傳輸。
TCP傳輸協議的特點:
- 面向連接的
- 通過流通道進行數據的傳輸
- 可靠的連接
- 速度慢
UDP協議傳輸
代碼示例:
發送端:
1 /** 2 3 1. 發送數據報包 4 ① 創建發送端的套接字對象。 5 ② 打包數據,用的 DatagramPacket 6 DatagramPacket(byte[] buf, int length, InetAddress address, int port) 7 ③ 發送 8 send(dp) 9 ④ 關閉資源 10 close 11 */ 12 public class 發送端 { 13 public static void main(String[] args) throws IOException, UnknownHostException { 14 // ① 創建發送端的套接字對象。 15 DatagramSocket ds=new DatagramSocket(); 16 String s=" 接收端您好 "; 17 byte[] buf=s.getBytes(); 18 DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 9000); 19 // 發送 20 ds.send(dp); 21 // 等待接收端的響應 --> 接收端 22 // 空的數據報包接收 23 byte[] buf1=new byte[1024]; 24 DatagramPacket dp1=new DatagramPacket(buf1, buf1.length); 25 ds.receive(dp1); 26 // 顯示 27 System.out.println(new String(dp1.getData())); 28 ds.close(); 29 } 30 }
接收端:
1 /** 2 . 用來接收數據報包 3 ① 創建一個接收數據的套接字。 4 ② 創建一個空的數據報包來接收數據 5 ③ 接收 receive(DatagramPacket p) 6 ④ 關閉 7 */ 8 public class 接收端 { 9 public static void main(String[] args) throws IOException { 10 // ① 創建一個接收數據的套接字。 11 DatagramSocket ds=new DatagramSocket(9000); 12 // ② 創建一個空的數據報包來接收數據 13 // DatagramPacket(byte[] buf, int length) 14 byte[] buf=new byte[1024]; 15 DatagramPacket dp=new DatagramPacket(buf, buf.length); 16 // 接收 17 ds.receive(dp); 18 // 顯示 getLength 返回接收到的數據的字節長度 19 System.out.println(new String(buf,0,dp.getLength())); 20 // 發送端響應 -- 》發送端 21 //getAddress/getPort 獲取發送端的 ip 地址與端口號 22 DatagramPacket p=new DatagramPacket(" 發送端您好 ".getBytes(), " 發送端您好 ".getBytes().length, d 23 p.getAddress(), dp.getPort()); 24 ds.send(p); 25 // 關閉 26 ds.close(); 27 } 28 }
TCP協議傳輸
代碼示例:
服務器端代碼:
1 package DemoEE; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 public class 服務器端3 { 9 10 public static void main(String[] args) throws IOException { 11 System.out.println("正在等待客戶端連接"); 12 ServerSocket ss=new ServerSocket(9004); 13 Socket s=ss.accept(); 14 InputStream is=s.getInputStream(); 15 byte[] bt=new byte[1024]; 16 int count=0; 17 while((count=is.read(bt))!=-1) { 18 System.out.println(new String(bt,0,count)); 19 } 20 } 21 }
客戶端代碼:
1 package DemoEE; 2 3 import java.io.IOException; 4 import java.io.OutputStream; 5 import java.net.InetAddress; 6 import java.net.Socket; 7 8 public class 客戶端3 { 9 10 public static void main(String[] args) throws IOException, IOException { 11 Socket s=new Socket(InetAddress.getByName("localhost"),9004); 12 OutputStream os=s.getOutputStream(); 13 os.write(new String("服務器端你好").getBytes()); 14 os.close(); 15 s.close(); 16 17 } 18 }
先執行服務器端,執行效果:
執行客戶端,執行效果:
代碼示例二:
服務器端:
1 /** 2 3 1. 創建服務器端的對象: 在指定端口監聽是否有客戶端進行連接。 4 2. 通過 accept 方法進行監聽,並通過三次握手建立連接流通道。 5 3. 從客戶端讀取內容,獲取流通道中的輸入流 6 4. 關閉資源 7 */ 8 public class 服務器端 { 9 public static void main(String[] args) throws IOException { 10 // 1. 創建服務器端的對象: 在指定端口監聽是否有客戶端進行連接。 11 ServerSocket ss=new ServerSocket(9000); 12 //2. 通過 accept 方法進行監聽,並通過三次握手建立連接流通道。 13 // 返回值為當前要連接的客戶端對象 14 System.out.println(" 等待客戶端的連接。。。。 "); 15 Socket s=ss.accept(); 16 //3. 從客戶端讀取內容,獲取流通道中的輸入流 17 InputStream is = s.getInputStream(); 18 // 讀取 19 byte[] b=new byte[1024]; 20 int count=0; 21 while((count=is.read(b))!=-1) { 22 System.out.println(new String(b,0,count)); 23 } 24 // 關閉資源 25 is.close(); 26 ss.close(); 27 } 28 }
客戶端:
1 /** 2 3 1. 創建客戶端的對象: 指定服務器,服務器的端口 4 2. 向服務器端寫入,獲取流通道中的輸出流 5 3. 關閉資源 6 */ 7 public class 客戶端 { 8 public static void main(String[] args) throws IOException { 9 // 1. 創建客戶端的對象: 指定服務器,服務器的端口 10 Socket s=new Socket(InetAddress.getByName("localhost"), 9000); 11 // 2. 向服務器端寫入,獲取流通道中的輸出流 12 OutputStream os = s.getOutputStream(); 13 os.write(" 服務器端您好 ".getBytes()); 14 // 關閉資源 15 os.close(); 16 s.close(); 17 } 18 }
代碼示例三:
進階班客戶端:
1 package com.tcp2; 2 import java.io.BufferedReader; 3 import java.io.BufferedWriter; 4 import java.io.InputStreamReader; 5 import java.io.OutputStream; 6 import java.io.OutputStreamWriter; 7 import java.net.InetAddress; 8 import java.net.Socket; 9 /** 10 11 1. 客戶端 12 */ 13 public class 客戶端 { 14 public static void main(String[] args) { 15 // 客戶端對象 16 try(Socket client=new Socket(InetAddress.getByName("localhost"), 9000); 17 // 用戶輸入 18 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 19 // 向服務器端發送信息,輸出流 20 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 21 // 讀取從服務器寫入的內容 輸入流 22 BufferedReader bre=new BufferedReader(new InputStreamReader(client.getInputStream())); 23 ){ 24 System.out.println(" 客戶端要發送到服務器端的內容為: "); 25 // 通過用戶輸入信息 26 String msg = br.readLine(); 27 // 將用戶輸入的信息發送到服務器端 28 bw.write(msg); 29 // 換行的標識 30 bw.newLine(); 31 // 刷新緩沖區 32 bw.flush(); 33 // 等待接收 34 String msgServer = bre.readLine(); 35 System.out.println(" 從服務器獲取的信息: "+msgServer); 36 }catch (Exception e) { 37 e.printStackTrace(); 38 } 39 } 40 }
進階版服務器端:
1 package com.tcp2; 2 import java.io.BufferedReader; 3 import java.io.BufferedWriter; 4 import java.io.InputStreamReader; 5 import java.io.OutputStreamWriter; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 /** 9 10 1. 服務器端 11 */ 12 public class 服務器端 { 13 public static void main(String[] args) { 14 // 服務器 15 try(ServerSocket ss=new ServerSocket(9000);){ 16 System.out.println(" 等待客戶端的連接。。。。。 "); 17 // 連接每一個客戶端 18 try(Socket client=ss.accept(); 19 // 讀取客戶端發送的信息 20 BufferedReader br=new BufferedReader(new InputStreamReader(client.getInputStream())); 21 // 獲取服務器端用戶輸入的信息 22 BufferedReader bin=new BufferedReader(new InputStreamReader(System.in)); 23 // 向客戶端寫入信息 24 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 25 ){ 26 // 讀取客戶端發來的信息 27 String clientMsg = br.readLine(); 28 System.out.println(" 從客戶端發來的消息為: "+clientMsg); 29 System.out.println(" 服務器端要發送到客戶端的內容為: "); 30 // 服務器端用戶輸入信息 31 String input = bin.readLine(); 32 // 向客戶端寫入 33 bw.write(input); 34 bw.newLine(); 35 bw.flush(); 36 }catch (Exception e) { 37 e.printStackTrace(); 38 } 39 }catch (Exception e) { 40 e.printStackTrace(); 41 } 42 } 43 }