InetAddress 此類用來表示網際網路協定(IP)位址
常用方法: String getHostName() 擷取此IP位址對應的主機名 String getHostAddress() 傳回IP位址的字元串表現形式
代碼表示: package com.czz.test09; import java.net.InetAddress; public class InetAddressDemo { public static void main(String[] args ) throws Exception { // 擷取 InetAddress 對象 InetAddress address = InetAddress. getByName ( " 叢中之 " ); // InetAddress address = InetAddress.getByName("192.168.14.42"); // 擷取對應的主機名 , 和 IP 位址 String ip = address .getHostAddress(); System. out .println( ip ); //192.168.14.21 String hostName = address .getHostName(); System. out .println( hostName ); } } UDP程式設計 發送端: User Datagram protocol: 使用者資料報協定 使用的類是 DatagramSocket 發送端發送資料步驟: 1.建立DatagramSocket對象 2.建立資料包 3.發送資料 4.關閉Socket 代碼示例: package com.czz.test09; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpSender { public static void main(String[] args ) throws Exception { // 建立 udp 協定發送端對象 DatagramSocket sock = new DatagramSocket(); // 建立資料報包 byte [] buf = "hell world" .getBytes(); int len = buf . length ; // 在給定主機名的情況下确定主機的 IP 位址 InetAddress address = InetAddress. getByName ( "localhost" ); int port = 3333; DatagramPacket pack = new DatagramPacket( buf , 0, len , address , port ); // 調用 sock 的方法發送資料包 sock .send( pack ); // 釋放資源 sock .close(); } } 接收端 接收端接收資料步驟: 1.建立DatagramSocket對象 2.建立接收資料包 3.接收資料,做進一步的處理 4.關閉Socket 代碼示例: package com.czz.test09; import java.net.DatagramPacket; import java.net.DatagramSocket ; public class UdpReceiver { public static void main(String[] args ) throws Exception { // 建立 DatagramSocket 對象 DatagramSocket sock = new DatagramSocket ( 3333 ); // 建立資料報包 byte [] buf = new byte [1024 * 64]; //64kb DatagramPacket pack = new DatagramPacket( buf , buf . length ); // 接收資料到資料報包中 sock .receive( pack ); // 解析資料 byte [] data = pack .getData(); // 擷取真實資料的長度 int len = pack .getLength(); System. out .println( new String( data , 0, len )); // 釋放資源 sock .close(); } } UDP程式設計練習 發送端接收從鍵盤錄入的資料,在接收端的控制台顯示出來 當鍵盤錄入886時,發送端結束發送 重點:接收端不能關閉,要一直等待發送端發送資料 發送端對鍵盤錄入資料也是一個循環判斷的過程 發送端代碼: package com.czz.test02; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; public class UdpSender { public static void main(String[] args ) throws Exception { Scanner sc = new Scanner(System. in ); // 建立 sock 對象 DatagramSocket sock = new DatagramSocket(); DatagramPacket pack ; InetAddress address = InetAddress. getByName ( " 叢中之 " ); while ( true ) { String line = sc .next(); if ( line .equals( "886" )) { break ; } byte [] buf = line .getBytes(); pack = new DatagramPacket( buf , buf . length , address , 8888); // 發送資料 sock .send( pack ); } // 釋放資源 sock .close(); } } 接收端代碼: package com.czz.test02; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UdpReceive { public static void main(String[] args ) throws Exception { // 建立 DatagramSocket 對象 DatagramSocket sock = new DatagramSocket(8888); byte [] buf = new byte [1024 * 64]; DatagramPacket pack = new DatagramPacket( buf , buf . length ); while ( true ) { sock .receive( pack ); // 解析資料包 byte [] data = pack .getData(); int length = pack .getLength(); String address = pack .getAddress().getHostAddress(); String hostName = pack .getAddress().getHostName(); System. out .println( " 發送端 IP 位址 : " + address + " 發送端主機名 : " + hostName + " 發送資料 :" + new String( data ,0, length )); } } } Socket通信原理 廣義上的Socket: 指網絡上兩個程式之間的通信(可能是TCP或UDP) 狹義上的Socket: 指的是TCP協定通信
定義: 網絡上進行雙向通信的兩個程式中的一個端點,是對本主機IP位址和端口号的一個封裝.即:socket = IP + port
TCP 協定 是一種可靠的網絡協定,俗稱"三次握手協定".它在通信的兩端各自履歷一個socket,進而在通信的兩端形成一個虛拟的網絡連接配接,一旦建立網絡連接配接,兩端就可以進行通信了. socket對象包含了主機和端口,并可以産生IO流來進行網絡間的通信.
TCP程式設計 示例: 用戶端: package com.czz.test03; import java.io.OutputStream; import java.net.Socket; public class Client { public static void main(String[] args ) throws Exception { // 建立 socket 對象 Socket sock = new Socket( " 叢中之 " , 8888); // 使用 socket 建立輸出流 OutputStream out = sock .getOutputStream(); // 向輸出流中寫入資料 out .write( " 倪玲是美女嗎 ?" .getBytes()); // 使用平台的預設字元集将此 String 編碼為 byte 序列,并将結果存儲到一個新的 byte 數組中 // 釋放資源 out .close(); sock .close(); } } 服務端: package com.czz.test03; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args ) throws Exception { // 建立 serversocket 對象 ServerSocket ss = new ServerSocket(8888); // 接收用戶端連接配接 Socket sock = ss .accept(); // 擷取輸入流 InputStream in = sock .getInputStream(); // 從流中擷取資料 byte [] buf = new byte [1024 * 5]; int len = in .read( buf ); System. out .println( new String( buf ,0, len )); // 釋放資源 in .close(); sock .close(); ss .close(); } } 練習: 從用戶端鍵盤錄入資料,顯示在服務端控制台上
用戶端: package com.czz.test04; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class Client { public static void main(String[] args ) throws Exception { Scanner sc = new Scanner(System. in ); // 建立 socket 對象 Socket sock = new Socket( " 叢中之 " , 7777); // 使用 socket 建立輸出流 OutputStream out = sock .getOutputStream(); while ( true ) { String line = sc .next(); // 阻塞式方法 if ( line .equals( "886" )) { break ; } byte [] bs = line .getBytes(); out .write( bs ); } out .close(); sock .close(); } } 服務端: package com.czz.test04; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args ) throws Exception { ServerSocket ss = new ServerSocket(7777); Socket sock = ss .accept(); // 阻塞式方法 InputStream in = sock .getInputStream(); byte [] b = new byte [1024]; int len = 0; while (( len = in .read( b )) != -1) { System. out .println( new String( b ,0, len )); } } } 從用戶端鍵盤錄入資料,顯示在服務端控制台上(優化方案) 用戶端: package com.Socket; import java.io.BufferedWriter; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Scanner; public class Client { public static void main(String[] args ) throws Exception { Scanner sc = new Scanner(System. in ); // 建立 socket 對象 Socket sock = new Socket( " 叢中之 " , 6666); // 使用 socket 對象建立輸出流 BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( sock .getOutputStream())); while ( true ) { String line = sc .nextLine(); if ( line .equals( "886" )) { break ; } bw .write( line ); bw .newLine(); bw .flush(); } bw .close(); sock .close(); } } 服務端: package com.Socket; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args ) throws Exception { // 建立 serversocket 對象 ServerSocket ss = new ServerSocket(6666); Socket socket = ss .accept(); BufferedReader br = new BufferedReader( new InputStreamReader( socket .getInputStream())); String line = null ; while (( line = br .readLine()) != null ) { System. out .println( line ); } } } 從用戶端發送一個文本檔案到服務端,儲存在服務端檔案中(實際上就是上傳檔案到伺服器) 發送端: package com.Socket2; import java.io.BufferedReader ; import java.io.BufferedWriter; import java.io.FileReader; import java.io.OutputStreamWriter; import java.net.Socket; public class Client { public static void main(String[] args ) throws Exception { Socket sock = new Socket( " 叢中之 " , 5555); BufferedReader br = new BufferedReader ( new FileReader( "czz.txt" )); BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( sock .getOutputStream())); String line = null ; while (( line = br .readLine()) != null ){ bw .write( line ); bw .newLine(); bw .flush(); } br .close(); bw .close(); sock .close(); } } 服務端: package com.Socket2; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args ) throws Exception { ServerSocket ss = new ServerSocket(5555); Socket socket = ss .accept(); BufferedReader br = new BufferedReader( new InputStreamReader( socket .getInputStream())); BufferedWriter bw = new BufferedWriter( new FileWriter( "nl.txt" )); String line = null ; while (( line = br .readLine()) != null ) { bw .write( line ); bw .newLine(); bw .flush(); } br .close(); bw .close(); } } 在服務端接收完檔案後,給用戶端傳遞一個回報資訊:檔案已成功接收 發送端: package com.czz.test09; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; public class Client { public static void main(String[] args ) throws Exception { Socket sock = new Socket( " 叢中之 " , 8888); // 資料源 BufferedReader br = new BufferedReader( new FileReader( "nl.txt" )); // 封裝字元流 BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( sock .getOutputStream())); // 流對考 String line = null ; while (( line = br .readLine()) != null ){ bw .write( line ); bw .newLine(); bw .flush(); } // 關閉輸出流 sock .shutdownOutput(); // 接收來自服務端的回報資訊 BufferedReader br2 = new BufferedReader( new InputStreamReader( sock .getInputStream())); String message = br2 .readLine(); System. out .println( message ); // 釋放資源 bw .close(); br .close(); sock .close(); } } 服務端: package com.czz.test09; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args ) throws Exception { ServerSocket ss = new ServerSocket(8888); Socket sock = ss . accept (); // 阻塞方法 BufferedReader br = new BufferedReader( new InputStreamReader( sock .getInputStream())); BufferedWriter bw = new BufferedWriter( new FileWriter( "czz.txt" )); String line = null ; while (( line = br .readLine()) != null ) { bw .write( line ); bw .newLine(); bw .flush(); } BufferedWriter bw2 = new BufferedWriter( new OutputStreamWriter( sock .getOutputStream())); bw2 .write( " 檔案接收完畢 " ); bw2 .close(); br .close(); bw .close(); sock .close(); ss .close(); } } 上傳圖檔到服務端 發送端: package com.czz.test10; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.net.Socket; public class Client { public static void main(String[] args ) throws Exception { Socket sock = new Socket( " 叢中之 " , 8888); // 封裝資料源 BufferedInputStream bis = new BufferedInputStream( new FileInputStream( "E:\\ 圖檔 \\ 寶馬 \\psb.jpg" )); // 封裝目的地 BufferedOutputStream bos = new BufferedOutputStream( sock .getOutputStream()); // 流的對考 int b = 0; while (( b = bis .read()) != -1){ bos .write( b ); bos .flush(); // 不重新整理也可以 , 關閉 bos 和 bis } // bos.close(); // bis.close(); sock .close(); } } 服務端: package com.czz.test10; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args ) throws Exception { ServerSocket ss = new ServerSocket(8888); Socket sock = ss .accept(); // 封裝資料源 BufferedInputStream bis = new BufferedInputStream( sock .getInputStream()); // 封裝目的地 BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream( "E:\\ 圖檔 \\ 寶馬 \\psb1.jpg" )); // 流的對考 int b = 0; while (( b = bis .read()) != -1){ bos .write( b ); } // 釋放資源 bos .close(); bis .close(); sock .close(); ss .close(); } }