前言
对网络通信有了一定的概念: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通后即网络层通信成功