網絡編程是指編寫運行在多個設備(計算機)的程序,這些設備都通過網絡連接起來。
java.net包中提供了兩種常見的網絡協議的支持:
在這裡我們主要講解socket編程(使用最為廣泛的網絡編程),舉個簡單的例子,就像是我們平常用的QQ,每個人用的都是一個Client(客戶端),而服務端則是騰訊的服務器,我們彼此之間的通信是通過先將消息發送到服務端,然後服務端轉發到目標客戶端(你想要發送給的對象),而不是每個客戶端直接通信。
由此我們可以得出socket通信的基本流程:
首先是客戶端:通過IP地址和port(端口號)與服務端建立連接->進行信息傳遞—>關閉連接,然後是服務端:對客戶端進行監聽—>建立連接—>信息傳遞—>關閉連接。
下面是一個簡單的實現客戶端和服務端通信的例子:
服務端:
1 package com.internet.server; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.OutputStream; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 9 public class TestServer { 10 public static void main(String[] args) { 11 ServerSocket serverSocket = null; 12 Socket socket = null; 13 OutputStream out = null; 14 InputStream in = null; 15 int port = 12125; 16 17 try { 18 serverSocket = new ServerSocket(port); 19 System.out.println("服務端開始監聽!!!"); 20 socket = serverSocket.accept(); 21 in = socket.getInputStream(); 22 byte[] b = new byte[1024]; 23 out = socket.getOutputStream(); 24 for (int i = 0; i < 3; i++) { 25 int n = in.read(b); 26 System.out.println("接收到的信息為:" + new String(b, 0, n)); 27 out.write(b, 0, n); 28 } 29 30 } catch (IOException e) { 31 e.printStackTrace(); 32 } finally { 33 try { 34 out.close(); 35 in.close(); 36 socket.close(); 37 serverSocket.close(); 38 } catch (IOException e) { 39 e.printStackTrace(); 40 } 41 } 42 43 } 44 }
客戶端:
1 package lib; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.OutputStream; 6 import java.net.Socket; 7 8 public class TestClient { 9 public static void main(String[] args) throws InterruptedException, 10 IOException { 11 Socket socket = null; 12 InputStream in = null; 13 OutputStream out = null; 14 // 定義端口 15 int port = 12125; 16 // 服務端的IP地址 17 String serverIP = "127.0.0.1"; 18 // 傳遞的數據 19 String data[] = { "First", "Second", "Third" }; 20 try { 21 socket = new Socket(serverIP, port); 22 out = socket.getOutputStream(); 23 in = socket.getInputStream(); 24 byte[] b = new byte[1024]; 25 for (int i = 0; i < data.length; i++) { 26 out.write(data[i].getBytes()); 27 int n = in.read(b); 28 System.out.println("傳遞的數據為:" + new String(b, 0, n)); 29 } 30 } catch (IOException e) { 31 e.printStackTrace(); 32 } finally { 33 in.close(); 34 out.close(); 35 socket.close(); 36 } 37 } 38 }
服務端和客戶端之間是通過我們之前提到的“流“(字節流)的方式進行信息傳遞的。在上述代碼中我們需要保證客戶端和服務端的端口號是一致的,同時客戶端中的IP地址我們可以填寫本機地址,即127.0.0.1也可以填寫外網IP。只需要一個服務端即可,然後在多個客戶端之間實現通信,當然這只是簡單的信息傳遞,如果想要編寫出類似於QQ的簡單的小程序還需要swing,多線程等知識,感興趣的小伙伴可以自行嘗試。