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通后即网络层通信成功
发布了95 篇原创文章 · 获赞 25 · 访问量 4200

猜你喜欢

转载自blog.csdn.net/key_768/article/details/104536183
今日推荐