菜鳥先飛之JAVA_網路程式設計
阿新 • • 發佈:2018-12-21
網路程式設計概述
計算機網路,是指將地理位置不同的具有獨立功能的多臺計算機及其外部裝置,通過通訊線路連線起來,在網路作業系統,網路管理軟體及網路通訊協議的管理和協調下,實現資源共享和資訊傳遞的計算機系統。
網路程式設計,就是用來實現網路互連的不同計算機上執行的程式間可以進行資料交換。
網路程式設計三要素 1)IP 每個裝置在網路中的唯一標識,每臺網絡終端在網路中都有一個獨立的地址,我們在網路中傳輸資料就是使用這個地址。IPv4:4個位元組組成,4個0-255。大概42億,30億都在北美,亞洲4億。2011年初已經用盡。IPv6:8組,每組4個16進位制數。 ipconfig:檢視本機IP ping:測試連線 本地迴路地址:127.0.0.1 255.255.255.255是廣播地址 2)埠號 每個程式在裝置上的唯一標識,每個網路程式都需要繫結一個埠號,傳輸資料的時候除了確定發到哪臺機器上,還要明確發到哪個程式。埠號範圍從0-65535,編寫網路應用就需要繫結一個埠號,儘量使用1024以上的,1024以下的基本上都被系統程式佔用了。 3)協議 a)UDP:面向無連線,資料不安全,速度快。不區分客戶端與服務端。 b)TCP:面向連線(三次握手),資料安全,速度略低。分為客戶端和服務端。三次握手: 客戶端先向服務端發起請求, 服務端響應請求, 傳輸資料。
Socket套接字概述
網路上具有唯一標識的IP地址和埠號組合在一起才能構成唯一能識別的識別符號套接字;通訊的兩端都有Socket;網路通訊其實就是Socket間的通訊;資料在兩個Socket間通過IO流傳輸;Socket在應用程式中建立,通過一種繫結機制與驅動程式建立關係,告訴自己所對應的IP和port。
UDP傳輸
TCP傳輸
網路程式設計三要素 1)IP 每個裝置在網路中的唯一標識,每臺網絡終端在網路中都有一個獨立的地址,我們在網路中傳輸資料就是使用這個地址。IPv4:4個位元組組成,4個0-255。大概42億,30億都在北美,亞洲4億。2011年初已經用盡。IPv6:8組,每組4個16進位制數。 ipconfig:檢視本機IP ping:測試連線 本地迴路地址:127.0.0.1 255.255.255.255是廣播地址 2)埠號 每個程式在裝置上的唯一標識,每個網路程式都需要繫結一個埠號,傳輸資料的時候除了確定發到哪臺機器上,還要明確發到哪個程式。埠號範圍從0-65535,編寫網路應用就需要繫結一個埠號,儘量使用1024以上的,1024以下的基本上都被系統程式佔用了。 3)協議 a)UDP:面向無連線,資料不安全,速度快。不區分客戶端與服務端。 b)TCP:面向連線(三次握手),資料安全,速度略低。分為客戶端和服務端。三次握手: 客戶端先向服務端發起請求, 服務端響應請求, 傳輸資料。
Socket套接字概述
UDP傳輸
public class Demo01_Send { /* * 傳送方 */ public static void main(String[] args) throws Exception { //定義要傳輸的資料 String s = "Hello Word !"; //建立DatagramSocket物件,隨機埠號 DatagramSocket ds = new DatagramSocket(); //建立DatagramPacket物件, 指定資料, 長度, 地址, 埠 DatagramPacket dp = new DatagramPacket(s.getBytes(), s.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666); //傳送資料 ds.send(dp); //關閉DatagramSocket ds.close(); } }
class Demo02_Receive { /* * 接收方 */ public static void main(String[] args) throws Exception { //建立DatagramSocket, 指定埠號 DatagramSocket ds = new DatagramSocket(6666); //建立DatagramPacket, 指定陣列, 長度 DatagramPacket dp = new DatagramPacket(new byte[1024], 1024); //接收資料 ds.receive(dp); //獲取資料 byte[] arr = dp.getData(); //獲取資料長度 int len = dp.getLength(); //列印在控制檯 System.out.println(new String(arr, 0, len)); //關閉DatagramSocket物件 ds.close(); } }
TCP傳輸
public class Demo06_Clinet {
public static void main(String[] args) throws Exception, IOException {
// 建立Socket連線服務端(指定ip地址,埠號)通過ip地址找對應的伺服器
Socket socket = new Socket("127.0.0.1", 12345);
// 呼叫Socket的getInputStream()和getOutputStream()方法獲取和服務端相連的IO流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
// 寫出資料到服務端
os.write((System.currentTimeMillis() + "你在幹啥?").getBytes());
byte[] arr = new byte[1024];
// 讀取服務端輸出的資料
int len = is.read(arr);
System.out.println(new String(arr, 0, len));
socket.close();
}
}
public class Demo07_Server {
public static void main(String[] args) throws IOException {
//建立ServerSocket,並指定埠號
ServerSocket server = new ServerSocket(12345);
// 呼叫ServerSocket的accept()方法接收一個客戶端請求,得到一個Socket
Socket socket = server.accept();
// 呼叫Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
byte[] arr = new byte[1024];
// 讀取客戶端的寫出的資料
int len = is.read(arr);
System.out.println(new String(arr, 0, len));
// 寫出資料到客戶端
os.write((System.currentTimeMillis() + "啥也沒幹").getBytes());
socket.close();
}
}