JAVA------UDP接受資料傳送資料
網路程式設計三要素:
- IP地址
- 埠
- 協議
一、IP地址
IP地址常用命令:
- ipconfig:檢視本機ip地址
- ping IP地址:檢查網路是否連通
- 特殊IP地址:127.0.0.1,是回送地址,可以代表本機地址,一般用來測試使用
IP地址
IP地址:是網路中裝置的唯一標識
IP地址分為兩大類:
-
IPv4: 是給每個連線在網路上的主機分配一個32bit地址。 按照TCP/IP規定, IP地址用二進位制來表示,每個IP地址長32bit,也就是4個位元組。例如一個採用二進位制形式的IP地址是“10100000 10101000 000000101000010* , 這麼長的地址,處理起來也太費勁了。為了方便使用。IP地址經常被寫成十進位制的形式,中間使用符號““分隔不同的位元組。於是,上面的IP地址可以表示為"192.168.1.66” . IP地址的這種表示法叫做"點分十進位制表示法”,這顯然比1和0容易記憶得多
-
IPv6: 由於網際網路的蓬勃發展,IP地址的需求量愈來愈大,但是網路地址資源有限,使得IP的分配越發緊張。為了擴大地址空間,通過IPv6重新定義地址空間,採用128位地址長度,每16個位元組一組,分成8組十六進位制數,這樣就解決了網路地址資源數量不夠的問題
InetAddress的使用
為了方便我們對IP地址的獲取和操作, Java提供 了一個類InetAddress 供我們使用
InetAddress:此類表示Internet協議 (IP) 地址
-
static InetAddress getByName(String host):確定主機名稱的IP地址。
主機名稱可以是機器名稱,也可以是IP地址 -
String getHostName():獲取此IP地址的主機名
-
String getHostAddress()返回文字顯示中的IP地址字串
看程式碼演示:
netAddress address=InetAddress.getByName("LAPTOP-A61GB327");
這個LAPTOP-A61GB327是我計算機名稱,換成本機ip也可以
package InteAddress;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InteAdressDemo {
public static void main(String[] args) throws UnknownHostException{
InetAddress address=InetAddress.getByName("LAPTOP-A61GB327");
String name=address.getHostName();
String ip=address.getHostAddress();
System.out.println("主機名:"+name);
System.out.println("ip地址:"+ip);
}
}
二、埠
埠是裝置上應用程式的唯一標識
埠號:用兩個位元組表示的整數,它的取值範圍是0~65535。 其中,0~ 1023之間的埠號用於-些知名的網路服務和應用,普通的應用程式需要使用1024以上的埠號。如果埠號被另外-個服務或應用所佔用,會導致當前程式啟動失敗
三、協議
協議:計算機網路中,連線和通訊的規則被稱為網路通訊協議
1. UDP協議
-
使用者資料報協議(User Datagram Protocol)
UDP是無連線通訊協議,即在資料傳輸時,資料的傳送端和接收端不建立邏輯連線。簡單來說,當一臺計算機向另外一臺計算機發送資料時, 傳送端不會確認接收端是否存在,就會發出資料,同樣接收端在收到資料時,也不會向傳送端反饋是否收到資料。
由於使用UDP協議消耗資源小,通訊效率高,所以通常都會用於音訊視訊和普通資料的傳輸 -
例如視訊會議通 常採用UDP協議,因為這種情況即使偶爾丟失-兩個資料包,也不會對接收結果產生太大影響。但是在使用UDP協議傳送資料時,由於UDP的面向無連線性,不能保證資料的完整性,因此在傳輸重要資料時不建議使用UDP協議
2. TCP協議
-
傳輸控制協議 (Transmission Control Protocol)
TCP協議是面向連線的通訊協議,即傳輸資料之前,在傳送端和接收端建立邏輯連線,然後再傳輸資料,它提供了兩臺計算機之間可靠無差錯的資料傳輸。在TCP連線中必須要明確客戶端與伺服器端,由客戶端向服務端發出連線請求,每次連線的建立都需要經過“三次握手" -
三次握手: TCP協議中,在傳送資料的準備階段,客戶端與伺服器之間的三次互動,以保證連線的可靠
第1次握手,客戶端向伺服器端發出連線請求,等待伺服器確認
第2次握手,伺服器端向客戶端回送一個響應, 通知客戶端收到了連線請求
第3次握手,客戶端再次向伺服器端傳送確認資訊,確認連線。 -
完成三次握手,連線建立後,客戶端和伺服器就可以開始進行資料傳輸了。由於這種面向連線的特性,TCP協議可以保證傳輸資料的安全,所以應用十分廣泛。例如上傳檔案、下載檔案、 瀏覽網頁等
四、UDP接受資料傳送資料
UDP傳送資料的步驟:
- 建立傳送端的Socket物件(DatagramSocket)
- 建立資料,並將資料打包
- 呼叫DatagramSocket物件的方法傳送資料
- 關閉傳送端
看程式碼演示:
package UDP;
import java.io.IOException;
import java.net.*;
public class SendDemo {
public static void main(String[] args) throws IOException{
//建立傳送端的Socket物件(DatagramSocket)
DatagramSocket ds=new DatagramSocket();
//建立資料,並將資料打包
//DatagramPacket(byte[] buf,int length,InetAddress address,int port)
//構造一個數據包,傳送長度為length的資料包到指定主機上的指定埠號
byte[] bys="hello,udp".getBytes();
int len=bys.length;
InetAddress address=InetAddress.getByName("192.168.223.1");
int port=10086;//埠號
DatagramPacket dp=new DatagramPacket(bys,len,address,port);
//呼叫DatagramSocket物件的方法傳送資料
//void send(DatagramSocket p) 從此套接字傳送資料包
ds.send(dp);
//關閉傳送端
ds.close();
}
}
UDP接收資料的步驟:
- 建立接受端的Socket物件(DatagramSocket)
- 建立資料包,用於接受資料
- 呼叫DatagramSocket物件的方法接收資料
- 關閉傳送端
直接看程式碼:
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class RecriveDemo {
public static void main(String[] args) throws IOException{
//建立接受端的Socket物件(DatagramSocket)
//DatagramSocket(int port)構造資料報套接字並將其繫結到本地主機的指定埠
DatagramSocket ds=new DatagramSocket(10086);
//建立資料包,用於接受資料
//DatagramPacket(byte[] buf,int length)構造一個DatagramPacket用於接受長度為lenth資料包
byte[] bys=new byte[1024];
DatagramPacket dp=new DatagramPacket(bys, bys.length);
//呼叫DatagramSocket物件的方法接收資料
ds.receive(dp);
//解析資料包,並把資料在控制檯顯示
//byte[] getData()返回資料緩衝區
byte datas[]=dp.getData();
//int getlength()返回要傳送的資料的長度或接收到的資料長度
int len=dp.getLength();
String dataString=new String(datas,0,len);
System.out.println("資料是:"+dataString);
//關閉傳送端
ds.close();
}
}
這裡IP地址是我本機IP,也就是傳送給自己資料,然後接收端來接受,就可以接收到傳送的資料"hello,udp"