天天看點

8、網絡

web方向:少用

android:常用  

一、網絡通訊三要素:

     1、IP:32位的二進制資料,切成4分,每份8位(192.168.1.1),0~255

     2、端口:辨別該消息給哪個應用程式處理的辨別符,0~65535,

     3、協定

IP位址

  IP位址=網絡号+主機号(192.168.1 +1)

  IP位址分類:

       1、A類位址 = 一個網絡号+三個主機号 2^24 政府機關

       2、B類位址 = 兩個網絡号+兩個主機号 2^16 事業機關

       3、C類位址 = 三個網絡号+一個主機号 2^8 私人

1、IP類 InetAddress

常用方法:

(1)傳回主機的IP位址對象,靜态方法,沒有構造方法

     getLocalHost();

(2)傳回IP位址的字元串表示形式

     getHostAddress();

(3)傳回主機名

     getHostName();

(4)根據主機名或者IP位址的字元串形式确定IP位址對象

     getByName();

(5)傳回IP位址的數組形式

     getAllByName();

2、端口

     範圍:0~65535

     0~1023:系統緊密綁定的服務

     1024~65535:可以使用

 3、協定:

(1)UDP:飛秋,遊戲

(2)TCP                

在Java中網絡通信也稱為Socket(套接字/插座),要求都安裝了Socket,不同的協定就有不同的Socket

二、UDP通訊協定

1、特點

(1)将資料源及其目的封裝為資料包,面向無連接配接

(2)資料包限制在64K

(3)不可靠

(4)速度快

(5)UDP不分服務端與用戶端,隻分發送端與接收端

UDP協定下的Socket:

    (1)DatagramSocket:UDP插座服務,發送和接收資料包的套接字

    (2)DatagramPacket:資料包類     

     DatagramPacket(buf, length, address, port);  // buf發送的内容;length發送資料内容大小;address發送目的IP位址對象;port端口号

2、發送端步驟

(1)建立UDP服務

(2)準備資料,把資料封裝到資料包中,發送端要IP位址和端口号

(3)調用UDP發送資料

(4)關閉資源

3、接收端步驟

(1)建立UDP服務,監聽端口

(2)準備空的資料包

(3)調用UDP服務接收資料

(4)關閉資源

每個程式都有自己處理的特定資料格式,接收到的資料不符合指定格式,那麼就被丢棄

飛秋格式

版本号:時間:發送人:IP:發送辨別符(32):真正内容

在UDP協定中有個IP位址為廣播位址,主機号為255的位址

給廣播IP位址發送消息時,同一網絡段的主機都可以接收到消息

1 // UDP發送端
 2 public static void sendUDPMsg() throws IOException {
 3     // 建立UDP服務
 4     DatagramSocket datagramSendSocket = new DatagramSocket();
 5     // 把資料封裝到資料包中
 6     String data = "UDP測試資料";
 7     // 建立資料包
 8     DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getLocalHost(), 9090);
 9     // 調用UDP的服務發送資料包
10     datagramSendSocket.send(datagramPacket);
11     // 關閉資源
12     datagramSendSocket.close();
13 }      
1 public static void reveiveUDPMsg() throws IOException{
 2     // 建立UDP服務,監聽端口
 3     DatagramSocket datagramReceiveSocket = new DatagramSocket(9090);
 4     // 建立新的資料包用于存放資料
 5     byte[] buf = new byte[1024];
 6     DatagramPacket datagramReceivePacket = new DatagramPacket(buf, buf.length);
 7     // 調用UDP服務接收資料存放在資料包的buf中
 8     datagramReceiveSocket.receive(datagramReceivePacket);
 9     System.out.println("接收到的資料:"+new String(buf, 0, datagramReceivePacket.getLength()));
10     // 關閉資源
11     datagramReceiveSocket.close();
12 }      
1 // 群聊接收端
 2 public class WeChatSender extends Thread{
 3 
 4     @Override
 5     public void run() {
 6         // 不能直接抛出異常,Thread
 7         try {
 8             // 建立UDP服務
 9             DatagramSocket datagramSendSocket = new DatagramSocket();
10             // 準備資料,封裝到資料包中,用BufferedReader封裝可以逐行讀取
11             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
12             // 發送資料
13             String line = null;
14             DatagramPacket datagramSendPacket = null;
15             while((line = bufferedReader.readLine())!=null) {
16                 // 把資料封裝到資料包中然後發送
17                 datagramSendPacket = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("192.168.1.255"), 9090);
18                 // 發送資料
19                 datagramSendSocket.send(datagramSendPacket);
20             }
21             // 關閉資源
22             datagramSendSocket.close();
23         } catch (IOException e) {
24             // TODO Auto-generated catch block
25             e.printStackTrace();
26         }
27     }
28 }      
1 // 群聊接收端
 2 public class WeChatReveiver extends Thread{
 3     
 4     @Override
 5     public void run() {
 6         try {
 7             // 建立UDP服務,監聽端口
 8             DatagramSocket datagramReveiveSocket = new DatagramSocket(9090);
 9             // 準備空的資料包存儲資料
10             byte[] buf = new byte[1024];
11             DatagramPacket datagramReveivePacket = new DatagramPacket(buf, buf.length);
12             // 調用UDP接收資料
13             boolean flag = true;
14             while(flag) {
15                 datagramReveiveSocket.receive(datagramReveivePacket);
16                 System.out.println(datagramReveivePacket.getAddress().getHostAddress()+":"+new String(buf, 0, datagramReveivePacket.getLength()));
17             }
18             // 關閉資源
19             datagramReveiveSocket.close();  // 要是判斷條件直接為true會永遠執行不到
20         } catch (IOException e) {
21             // TODO Auto-generated catch block
22             e.printStackTrace();
23         }
24     }
25 }      

 三、TCP通訊協定

1、特點

     1、基于IO流進行資料傳輸的,面向連接配接的

     2、資料傳輸大小無限制

     3、三次握手(A->B(在?),B->A(在),A->B(好的))保證資料完整性,可靠的協定

     4、速度慢

     5、區分用戶端和服務端

2、TCP協定下的socket

     Socket:用戶端,用戶端一啟動馬上與服務端進行通訊

     SeverSocket:服務端

3、TCP用戶端步驟:

(1)建立TCP用戶端服務

(2)擷取socket對應的流對象

(3)寫或讀資料

(4)關閉資源

4、TCP服務端步驟:

(1)建立TCP服務端的服務

(2)接收用戶端的連接配接,産生一個socket

(3)擷取對應的流對象,讀或寫出資料

(4)關閉資源

用BufferedReader就是想調用readLine()方法一行一行的讀取字元,持續輸入的時候需要在拼接的字元串後面加上

作為是否為null的判斷條件