天天看點

java學習第25天--網絡程式設計

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流來進行網絡間的通信.

java學習第25天--網絡程式設計

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();    } }    

繼續閱讀