IP地址与端口概念
IP地址与端⼝概念
IP地址
在⽹络中每台计算机都必须有⼀个的IP地址;
假如我是一只蚂蚁
32位,4个字节,常⽤点分⼗进制的格式表⽰,例如:192.168.1.100
127.0.0.1 是固定ip地址,代表当前计算机,相当于⾯向对象⾥的 "this"
端⼝
两台计算机进⾏连接,总有⼀台服务器,⼀台客户端。
服务器和客户端之间的通信通过端⼝进⾏。如图:
ip地址是 192.168.1.100的服务器通过端⼝ 8080
与ip地址是192.168.1.189的客户端 的1087端⼝通信
获取本机IP地址
package socket;
import java.InetAddress;
import java.UnknownHostException;
public class TestSocket {
public static void main(String[] args) throws UnknownHostException {
InetAddress host = LocalHost();
String ip =HostAddress();
System.out.println("本机ip地址:" + ip);
}
}
槐花怎么保存时间长ping命令
使⽤ping判断⼀个地址是否能够到达
ping不是java的api,是windows中的⼀个⼩⼯具,⽤于判断⼀个地址的相应时间
如图
ping 192.168.2.106 可以返回这个地址的响应时间 time<1ms表⽰很快,局域⽹⼀般就是这个响应时间
ping 192.168.2.206 返回Request timed out表⽰时间较久都没有响应返回,基本判断这个地址不可⽤
使⽤java 执⾏ping命令
借助 Runtime().exec() 可以运⾏⼀个windows的exe程序
如图,使⽤java运⾏ ping 192.168.2.106,返回这样的字符串
package socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class TestSocket {
public static void main(String[] args) throws IOException {
Process p = Runtime().exec("ping " + "192.168.2.106");
BufferedReader br = new BufferedReader(new InputStream()));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
if (line.length() != 0)
对烟花一瞬间的感悟sb.append(line + "\r\n");
无法获取ip地址
}
System.out.println("本次指令返回的消息是:");
System.out.String());
}
}
判断本⽹段有多少可⽤的ip地址
⾸先获取 获取本机IP地址,⽐如说是192.168.2.100。 那么本⽹段的ip地址就是从 192.168.2.1 到 192.168.2.255再通过使⽤java 执⾏ping命令 判断这些ip地址能否使⽤,把能够使⽤的ip打印出来
为了提⾼效率,使⽤多线程⽅式同时ping。 但是如果开启255个线程,⼜会因为⽹络端⼝太拥挤,会被判定为⽆法ping通。所以本例使⽤java⾃带线程池,线程池的连接数还不能太⼤,启动了15个线程。
等待所有的线程结束后打印出ping通了的ip地址。
package socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import urrent.LinkedBlockingQueue;
import urrent.ThreadPoolExecutor;
import urrent.TimeUnit;
import urrent.atomic.AtomicInteger;
public class TestSocket {
public static void main(String[] args) throws IOException, InterruptedException {
InetAddress host = LocalHost();
String ip = HostAddress();
String ipRange = ip.substring(0, ip.lastIndexOf('.'));
System.out.println("本机ip地址:" + ip);
System.out.println("⽹段是: " + ipRange);
千里单骑打一数字
List<String> ips = Collections.synchronizedList(new ArrayList<>());
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 15, 60, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
AtomicInteger number = new AtomicInteger();
for (int i = 0; i < 255; i++) {
String testIP = ipRange + "." + (i + 1);
@Override
public void run() {
boolean reachable = isReachable(testIP);
if (reachable)
/
/ System.out.println("到可连接的ip地址:" + testIP);
ips.add(testIP);
synchronized (number) {
System.out.println("已经完成:" + number.incrementAndGet() + " 个 ip 测试");
}
}
});
});
}
// 等待所有线程结束的时候,就关闭线程池
threadPool.shutdown();
/
/等待线程池关闭,但是最多等待1个消失
if (threadPool.awaitTermination(1, TimeUnit.HOURS)) {
System.out.println("如下ip地址可以连接");
for (String theip : ips) {
System.out.println(theip);
}
System.out.println("总共有:" + ips.size() + " 个地址");
}
}
private static boolean isReachable(String ip) {
try {
boolean reachable = false;
Process p = Runtime().exec("ping -n 1 " + ip);
BufferedReader br = new BufferedReader(new InputStream()));            String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
if (line.length() != 0)
sb.append(line + "\r\n");
}
//当有TTL出现的时候,就表⽰连通了
收款码3月1日怎么办reachable = sb.toString().contains("TTL");
br.close();
return reachable;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。