網路編程——基於TCP協議的Socket編程,基於UDP協議的Socket編程,socketudp
Socket編程
目前較為流行的網路編程模型是客戶機/伺服器通訊模式
客戶進程向伺服器處理序發出要求某種服務的請求,伺服器處理序響應該請求。,通常,一個伺服器處理序會同時為多個用戶端進程服務,圖中伺服器處理序B1同時為客戶進程A1、A2和B2提供服務。
Socket概述
① 所謂Socket通常也稱作“通訊端”,用於描述IP地址和連接埠,是一個通訊鏈的控制代碼。應用程式通常通過“通訊端”向網路發出請求或者應答網路請求。
② Socket是串連運行在網路上的兩個程式間的雙向通訊的端點。
③ 網路通訊其實指的就是Socket間的通訊。
④ 通訊的兩端都有Socket,資料在兩個Socket之間通過IO來進行傳輸。
使用Socket進行網路通訊的過程
① 伺服器程式將一個通訊端綁定到一個特定的連接埠,並通過此通訊端等待和監聽客戶的串連請求。
② 客戶程式根據伺服器程式所在的主機和連接埠號碼發出串連請求。
③ 如果一切正常,伺服器接受串連請求。並獲得一個新的綁定到不同連接埠地址的通訊端。
④ 客戶和伺服器通過讀、寫通訊端進行通訊。
基於TCP協議的Socket編程
① 建立TCP服務端步驟:
a) 建立一個ServerSocket對象
b) 調用accept()方法接受用戶端請求
c) 從Socket中擷取I/O流
d) 對I/O流進行讀寫操作,完成與用戶端的互動
e) 關閉I/O流和Socket
② 建立TCP用戶端步驟:
a) 建立一個Socket對象
b) 從Socket中擷取I/O流
c) 對I/O流進行讀寫操作,完成與服務端的互動
d) 關閉I/O流和Socket
註:用戶端和服務端進行資料轉送時,用戶端的輸入資料流對應服務端的輸出資料流,用戶端的輸出資料流對應服務端的輸入資料流。
樣本:建立一個用戶端與服務端通訊的例子
包名:com.iotek.tcpsocket
服務端:
1 // 1.建立一個ServerSocket對象 2 ServerSocket serverSocket = new ServerSocket(8888); 3 // 2.調用accept()方法接受用戶端請求 4 Socket socket = serverSocket.accept(); 5 System.out.println(socket.getInetAddress().getHostAddress() + "串連成功"); 6 // 3.擷取socket對象的輸入輸出資料流 7 BufferedReader br = new BufferedReader(new InputStreamReader( 8 socket.getInputStream())); 9 10 PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);11 String line = null;12 // 讀取用戶端傳過來的資料13 while ((line = br.readLine()) != null) {14 if (line.equals("over")) {15 break;16 }17 System.out.println(line);18 pw.println(line.toUpperCase());19 }20 21 pw.close();22 br.close();23 socket.close();24 System.out.println(socket.getInetAddress().getHostAddress() + "中斷連線");
用戶端:
1 Socket socket = new Socket("127.0.0.1", 8888); 2 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 3 4 PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); 5 BufferedReader reader = new BufferedReader(new InputStreamReader( 6 socket.getInputStream())); 7 while (true) { 8 String line = br.readLine();// 擷取鍵盤所輸入的字串 9 pw.println(line);10 if (line.equals("over")) {11 break;12 }13 System.out.println(reader.readLine());// 擷取服務端傳過來的大寫字串14 }15 reader.close();16 br.close();17 pw.close();18 socket.close();
為了更直觀的看見通訊過程,將2個java程式複製到E盤根目錄下,用命令列的形式來運行。
開啟cmd,編譯java,步驟
① 進入e盤。 e:
② 編譯所有java檔案。 javac –d . *.java
③ 開啟服務端。 java com.iotek.tcpsocket.TCPServer
④ 再開啟一個cmd命令列用於開啟用戶端java com.iotek.tcpsocket.TCPClient
串連成功
在用戶端輸入hello斷行符號之後測試成功。
輸入over,中斷連線
基於UDP協議的Socket編程
① 建立發送端
a) 建立DatagramSocket對象。該端點建立,系統會隨機分配一個連接埠。如果不想隨機配置,可以手動指定。
b) 將資料進行packet包的封裝,必須要指定目的地地址和連接埠。
c) 通過socket服務的send方法將該包發出。
d) 將socket關閉。
② 建立接收端
a) 建立DatagramSocket對象。要監聽一個連接埠。
b) 通過socket的receive方法將資料存入資料包中。
c) 通過資料包dp的方法getData()、getAddress()、getPort()等方法擷取包中的指定資訊。
d) 將socket關閉。
樣本:建立一個發送與接收的例子
發送端:UDPDemo1
1 DatagramSocket socket = new DatagramSocket(); 2 String str = "i love you"; 3 // 把資料進行封裝到資料報包中 4 DatagramPacket packet = new DatagramPacket(str.getBytes(), 5 str.length(), InetAddress.getByName("localhost"), 6666); 6 socket.send(packet);// 發送 7 8 byte[] buff = new byte[100]; 9 DatagramPacket packet2 = new DatagramPacket(buff, 100);10 socket.receive(packet2);11 System.out.println(new String(buff, 0, packet2.getLength()));12 socket.close();
接收端:UDPDemo2
1 // 先接收資料 2 DatagramSocket socket = new DatagramSocket(6666); 3 byte[] buff = new byte[100]; 4 DatagramPacket packet = new DatagramPacket(buff, 100); 5 socket.receive(packet);// 接受傳來的資料包 6 System.out.println(new String(buff, 0, packet.getLength())); 7 8 // 發送資料 9 String str = "me too";10 DatagramPacket packet2 = new DatagramPacket(str.getBytes(),11 str.length(), packet.getAddress(), packet.getPort());12 socket.send(packet2);13 socket.close();
將2個java程式複製到E盤根目錄下,用命令列的形式來運行。
開啟cmd,編譯java,步驟:
① 進入e盤。 e:
② 編譯以UDP開頭的檔案。 javac –d . UDP*.java
③ 先運行接收端。 java com.iotek.tcpsocket.UDPDemo2
④ 重新開啟一個命令列,運行發送端。 java com.iotek.tcpsocket.UDPDemo1