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的判斷條件