前言
對網絡通信有了一定的概念:IP協議、TCP\UDP協議
開始接觸網絡編程:網絡層通信
目錄
- IP地址
- 獲得本機IP地址
2.1. InetAddress類 - Ping命令
3.1. Runtime類
3.2. Java中的Ping命令
3.3. Process類
3.4. 通過Process類方法獲得完整信息 - 總結
IP地址
我們知道想要網絡通信,必須要知道IP地址
IP地址是網絡層規定網絡的地址,現在常用的IPv4是32位二進制,以點分十進制表示(每次啓動路由器隨機分配)
例如我的IP地址:192.168.88.1
通過子網掩碼可以區分網絡號、主機號
網絡通信過程(來自網絡):
其中IP地址用於定位
獲得本機IP地址
//獲得本地InetAddress對象
InetAddress inetAddress=InetAddress.getLocalHost();
//獲得本地IP地址
String localAddress=inetAddress.getHostAddress();
InetAddress類
InetAddress 類在Java.net包裏
InetAddress類的對象用於IP地址和域名
- InetAddress.getLocalHost()獲得本地InetAddress對象
- InetAddress.getByName()獲得遠程InetAddress對象
InetAddress類封裝了一下方法:
getHostAddress()獲取InetAddress對象的IP地址
getHostName()獲取InetAddress對象的域名
InetAddress NewinetAddress = InetAddress.getByName("www.csdn.net");
System.out.println(NewinetAddress.getHostAddress());
可以通過網址找到CSDN的遠程地址(DNS協議)
通過InetAddress類就可以找到本地IP地址
Ping命令
PING (Packet Internet Groper),因特網包探索器,用於測試網絡連接量的程序
ping不是java的API,而是操作系統的工具
我的電腦操作系統是Windows10
cmd命令就可以ping了
這是ping通了的界面
沒ping通:
這是在操作系統中的Ping命令
如果在想在Java中實現Ping可以通過Runtime類
Runtime類
每個java程序在運行時相當於啓動了一個JVM進程,每個JVM進程都對應一個Runtime實例(設計模式的單例模式)
Runtime實例只能有一個且由JVM創建,我們只有調用的權力,通過getRuntime() 獲得引用
Runtime實例代表應用程序運行時的環境(JVM環境等)
常用方法:
- getRuntime():Runtime,返回與當前Java應用程序關聯的運行時對象
- exec(String):Process,根據指定的路徑,在單獨的進程中執行指定的字符串命令的方法,返回Process實例
- freeMemory():long,返回Java虛擬機中的可用內存量
- exit(int):void,通過啓動其關閉序列來終止當前運行的Java虛擬機(exit(0)命令,結束運行)
Java中的Ping命令
Runtime的exec方法可以根據指定的路徑執行對應的可執行文件
Java中執行的其實是操作系統中的ping命令
注意:ping後面要加個空格(操作系統的命令都:命令(空格)命令值)
Runtime.getRuntime().exec("ping "+"192.168.88.109")
返回的是process對象
Process類
Process類是一個抽象類,提供獲取子進程的輸入流、子進程的輸出流、子進程的錯誤流、等待進程完成、檢查進程的推出狀態以及銷燬進程的方法等
當然,以上的方法大部分是抽象方法,所有的io操作都是通過(輸入流、輸出流、錯誤流)重定向到父進程
通過Process類方法獲得完整信息
用緩存流獲得信息:
Process process=Runtime.getRuntime().exec("ping "+"192.168.88.109");
//緩存流建立在節點流上
//進程Process獲得輸入信息方法getInputStream
//節點流InputStreamReader,gbk編碼
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream(),("gbk")));
String line=null;
//stringBuilder可變字符串
StringBuilder stringBuilder=new StringBuilder();
while ((line=bufferedReader.readLine())!=null){
if (line.length()!=0){
stringBuilder.append(line+"\r\n");
}
}
System.out.println("本次指令返回的消息:"+stringBuilder.toString());
Process的IO流操作要在本進程完成
總結
- InetAddress對象的方法可以獲得本地、遠程的IP地址
- Java中的Ping操作可以通過Runtime對象的exec方法完成
- exec方法返回的是Process對象,該對象是抽象類,需要通過流獲得Ping信息
- Ping通後即網絡層通信成功