网络通信-1(InetAddress、UDP、TCP、DatagramPacket、DatagramSocket、UDP通信示例)
1. 網絡通信
1.1三要素:
1.2 Socket
為網絡編程提供的一種機制。
通信的兩端都有Socket。
網絡通信其實就是Socket間的通信,數據在兩個Socket之間通過IO傳輸。
2. InetAddress
所有已實現的接口:
Serializable
直接已知子類:
Inet4Address(32位), Inet6Address(128位)
表示互聯網協議 (IP) 地址。
- IP 地址是 IP 使用的 32 位或 128 位無符號數字,它是一種低級協議,UDP 和 TCP 協議都是在它的基礎上構建的。
- InetAddress 的實例包含 IP 地址,還可能包含相應的主機名(取決于它是否用主機名構造或者是否已執行反向主機名解析)。
- 地址類型:
- 單播:單個接口的標識符。發送到單播地址的數據包被交付給由該地址標識的接口。
- 多播:一組接口(通常屬于不同的節點)的標識符。發送到多播地址的數據包被交付給由該地址標識的所有接口。
- 主機名解析:
- 主機名到 IP 地址的解析:通過使用本地機器配置信息和網絡命名服務(如域名系統(Domain Name System,DNS)和網絡信息服務(Network Information Service,NIS))來實現。要使用的特定命名服務默認情況下是本地機器配置的那個。對于任何主機名稱,都返回其相應的 IP 地址。
- 反向名稱解析:意味著對于任何 IP 地址,都返回與 IP 地址關聯的主機。
InetAddress 類提供將主機名解析為其 IP 地址(或反之)的方法。
2.1 方法
static InetAddress getByName(String host):在給定主機名的情況下確定主機的 IP 地址。
- host:輸出后是主機名/IP地址
- IP:輸出后是/IP地址
- 有異常拋出:UnknownHostException
static InetAddress getLocalHost():返回本地主機
String getHostName():獲取此 IP 地址的主機名。
String getHostAddress():返回 IP 地址字符串(以文本表現形式)。
2.2 使用
import java.net.InetAddress; import java.net.UnknownHostException;public class Test{public static void main(String[] args) throws UnknownHostException{InetAddress local=InetAddress.getLocalHost();InetAddress remote=InetAddress.getByName("www.baidu.com");System.out.println("本地IP地址是:"+local.getHostAddress());System.out.println("百度的IP地址是:"+remote.getHostAddress());System.out.println("百度的主機名是:"+remote.getHostName());} }運行結果:
成功
3. UDP
User Datagram Protocol
用戶數據包協議
是無連通協議:在發送數據時,數據的發送端和接收端不建立邏輯連接
消耗資源少,通信效率高
用于音頻、視頻和普通數據的傳輸
不保證數據完整性
數據包大小在64K
4. TCP
TAransmission Control Protocol
傳輸控制協議
面向連接的通信協議
在傳輸數據前,先在發送端和接受選建立邏輯連接,再傳輸數據。
提供了兩臺計算機之間的可靠的無差錯疏忽傳輸
4.1 三次握手
創立連接
可保證傳輸數據的安全性
eg.下載文件
5. DatagramPacket
此類表示數據報包。 UDP通信中發送或者接受的數據
數據報包用來實現無連接包投遞服務(類似于集裝箱)。
每條報文僅根據該包中包含的信息從一臺機器路由到另一臺機器。
從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。
不對包投遞做出保證。
5.1 構造方法
DatagramPacket(byte[] buf,int length):?構造DatagramPacket,用來接收長度為length的數據包。
- 接收端的,只需要接收的一個字節數組來存放收到的數據,無需知道數據的來源
DatagramPacket(byte[] buf,int length,InetAddress address,int port):?構造數據報包,用來將長度為length的包發送到指定主機上的指定端口號。
- 接收字節數組,指定發送目的端的IP地址和端口號。
5.2 方法
InetAddress getAddress():發揮某臺機器的IP地址。此數據報將要發往該機器或者是從該機器接收到的。
int getPort():返回某遠程主機的端口號。此數據報將要發往該主機或者是從該主機接收到的。
byte[] getData():返回數據緩沖區
int getLength():返回將要發送或接收到的數據的長度。
6. DatagramSocket
此類表示用來發送和接收數據報包的套接字。
數據報套接字是包投遞服務的發送或接收點(類似于碼頭)。
每個在數據報套接字上發送或接收的包都是單獨編址和路由的。從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。
在 DatagramSocket 上總是啟用 UDP 廣播發送。為了接收廣播包,應該將 DatagramSocket 綁定到通配符地址。在某些實現中,將 DatagramSocket 綁定到一個更加具體的地址時廣播包也可以被接收。
DatagramSocket s=new DatagramSocket(null); s.bind(new InetSocketAddress(8888));?這等價于:
DatagramSocket s=new DatagramSocket(8888);兩個例子都能創建能夠在UDP 8888端口上接收廣播的DatagramSocket。
6.1 構造方法
DatagramSocket():構造數據報套接字并將其綁定到本地主機上任何可用的端口。
DatagramSocket(int port):創建數據報套接字并將其綁定到本地主機上的指定端口。
- 接收端:徐志鼎一個端口號,可監聽指定的端口;
- 發送端:可指定端口號;也可不指定,系統會分配一個沒有被其他網絡程序使用的端口號
6.2 方法
void receive(DatagramPacket p):?從此套接字接收數據報包。
void send(DatagramPacket p):從此套接字發送數據報包。
7. UDP網絡程序
7.1 發送端
- 創建DatagramSocket對象
- 創建DatagramPacket對象,并封裝數據
- 發送數據
- 釋放流資源
7.2 接收端
- 創建DatagramSocket對象
- 創建DatagramPacjet對象
- 接收數據存儲到DatagramPacket對象中
- 獲取DatagramPacket對象的內容
- 釋放流資源
運行結果:
7.3 分析
發送端
DatagramPacket dp=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("***本機IP地址***"),8888);如果此句中,主機名錯,UnknowHostException;端口號錯,可正常發出,接收端收不到。
無連接的協議,無接收端也可運行。
接收端
啟動兩次接收端:
- 第一次正常
- 第二次:BindException,端口號已綁定。
- 端口號不可重復,它是一個進程在內存中的地址
總結
以上是生活随笔為你收集整理的网络通信-1(InetAddress、UDP、TCP、DatagramPacket、DatagramSocket、UDP通信示例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IO-6(PrintStream/Pri
- 下一篇: 网络通信-2(TCP通信、ServerS