一:OSI模型
Open System Interconnection 開放系統互聯
二:TCP/IP分層模型
TCP代表傳輸控制協議:Transfer Control Protocol 允許兩個程序之前進行可靠的通訊
UDP代表用戶報文協議:User Datagram Protocol 允許兩個程序之前進行不可靠的通訊
三 客戶端 和 服務器
四:套接字
定義:Socket(套接字)是一種抽象層,應用程序通過它來發送和接收數據
五:InetAddress類代表IP地址,沒有構造器但是有多個方法,查詢API文檔。
六:TCP套接字編程
服務器:
–1.利用ServerSocket建立對服務端某個端口的監聽。如:ServerSocket server = new ServerSocket(8000);
–2.利用accept方法創建服務端Socket如:Socket socket = server.accept()
–3.利用已建立的socket創建輸入輸出流如:BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()));
–4.關閉輸入輸出流,關閉socket,關閉server如: br.close();
pw.close();
socket.close();
1 package inetAddress; 2 3 /** 4 * 服務器 5 */ 6 import java.io.BufferedReader; 7 import java.io.BufferedWriter; 8 import java.io.InputStreamReader; 9 import java.io.OutputStreamWriter; 10 import java.net.ServerSocket; 11 import java.net.Socket; 12 13 public class ServerTest { 14 15 public static void main(String[] args) throws Exception { 16 // 1創建ServerSocket對象指定端口號 17 ServerSocket server = new ServerSocket(30001); 18 server.setSoTimeout(10000); 19 // 2等待客戶連接 accept 返回類型Socket 20 Socket socket = server.accept(); 21 // 3從客戶端讀數據 socket.getInputStream() 22 BufferedReader reader = new BufferedReader(new InputStreamReader( 23 socket.getInputStream())); 24 char[] ch = new char[100]; 25 int len = reader.read(ch); 26 System.out.println("從客戶端接收到的消息:"); 27 System.out.println(new String(ch, 0, len)); 28 // 3向客戶端寫數據 socket.getOutputStream() 29 BufferedWriter write = new BufferedWriter(new OutputStreamWriter( 30 socket.getOutputStream())); 31 write.write("我們已經接收到消息了"); 32 write.flush(); 33 // 4 釋放資源 34 reader.close(); 35 socket.close(); 36 write.close(); 37 38 } 39 40 }
客戶端:
–1.創建客戶端Socket向服務器發起連接請求如:Socket socket = new Socket (“127.0.0.1”, 8000);
–2..利用已建立的socket創建輸入輸出流如:BufferedReader br = new BufferedReader( new InputStreamReader( socket.getInputStream()));
–3.關閉輸入輸出流,關閉socket,關閉server如: br.close();
pw.close();
socket.close();
1 package inetAddress; 2 3 /** 4 * 客戶端 5 */ 6 import java.io.BufferedReader; 7 import java.io.BufferedWriter; 8 import java.io.InputStreamReader; 9 import java.io.OutputStreamWriter; 10 import java.net.Socket; 11 12 public class Cliebt { 13 14 public static void main(String[] args) throws Exception { 15 // 1 創建Socket對象 主機 端口 16 Socket socket = new Socket("127.0.0.1", 30001); 17 // 2向服務器寫入數據 .getOutputStream() 18 BufferedWriter write = new BufferedWriter(new OutputStreamWriter( 19 socket.getOutputStream())); 20 write.write("你好服務器"); 21 write.flush(); 22 // 2讀出數據 .getInputStream() 23 BufferedReader reader = new BufferedReader(new InputStreamReader( 24 socket.getInputStream())); 25 char[] ch = new char[100]; 26 int len = reader.read(ch); 27 System.out.println("數據"); 28 System.out.println(new String(ch, 0, len)); 29 // 3 釋放資源 30 reader.close(); 31 write.close(); 32 socket.close(); 33 } 34 35 }
七:UDP套接字編程
用戶報文協議(UDP)是用於將二進制數據從一台計算機發送到另一台計算的非連接協議。 數據被稱為數據報包,它包含了數據將要發送到的目標服務器和端口號。 DatagramSocket類的send()和receive()方法都帶有一個DatagramPacket參數。1 package chap18UDP; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 7 /** 8 * 發送 9 * 10 * @author acer 11 * 12 */ 13 public class Sender { 14 15 public static void main(String[] args) throws IOException { 16 // * 1創建DatagramSocket對象 17 DatagramSocket scoket = new DatagramSocket(3000); 18 // *2 創建DatagramPacket對象 19 byte[] buffer = "你好".getBytes(); 20 int port = 30001; 21 DatagramPacket packet = new DatagramPacket(buffer, buffer.length, 22 scoket.getInetAddress().getLocalHost(), port); 23 // 3 使用send 24 scoket.send(packet); 25 System.out.println("正在發送消息"); 26 // 釋放資源 27 scoket.close(); 28 29 } 30 31 }接收數據報包需要執行如下步驟: 1. 創建一個足夠大的字節數組,用於存儲要接收的包的數據。 2. 使用該字節數組實例化一個DatagramPacket對象。 3. DatagramSocket被實例化,它被指定該套接字要綁定到的本地主機上的一個端口。 4. 調用DatagramSocket類的receive()方法,將DatagramPacket對象傳入該方法。這將導致執行線程阻塞,直到接收到一個數據報包或者發生了超時
1 package chap18UDP; 2 3 import java.net.DatagramPacket; 4 import java.net.DatagramSocket; 5 6 /** 7 * 接收 8 * 9 * @author acer 10 * 11 */ 12 public class Reciver { 13 14 public static void main(String[] args) throws Exception { 15 // 創建字節數組 16 byte[] buffer = new byte[1024]; 17 // 2 創建DatagramPacket對象 18 DatagramPacket packet = new DatagramPacket(buffer, buffer.length); 19 // 3 創建DatagramSocket對象 20 DatagramSocket socket = new DatagramSocket(30001); 21 // 4 使用receive方法 22 socket.receive(packet); 23 System.out.println("正在接收從" + packet.getSocketAddress() + "的信息"); 24 System.out.println(new String(packet.getData())); 25 // 釋放資源 26 socket.close(); 27 28 } 29 30 }p發送數據報包需要執行如下步驟: •1. 創建一個足夠大的字節數組,用於存儲要發送的包數據,用該數據填充數組。 •2. 創建一個新的DatagramPacket 對象,用於存儲上面的字節數組,以及服務器名和接收者的端口號。 •3. DatagramSocket被實例化,它被指定套接字要綁定到本地主機的哪個端口。 •4. DatagramSocket類的send()方法被調用,傳入DatagramPacket對象。