一: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對象。