Java網絡編程(1)IP地址通信

前言

對網絡通信有了一定的概念:IP協議、TCP\UDP協議
開始接觸網絡編程:網絡層通信

目錄

  1. IP地址
  2. 獲得本機IP地址
    2.1. InetAddress類
  3. Ping命令
    3.1. Runtime類
    3.2. Java中的Ping命令
    3.3. Process類
    3.4. 通過Process類方法獲得完整信息
  4. 總結

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流操作要在本進程完成

總結

  1. InetAddress對象的方法可以獲得本地、遠程的IP地址
  2. Java中的Ping操作可以通過Runtime對象的exec方法完成
  3. exec方法返回的是Process對象,該對象是抽象類,需要通過流獲得Ping信息
  4. Ping通後即網絡層通信成功
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章