IP地址与端口概念

IP地址与端口概念

IP地址与端口概念

最新推荐文章于 2025-08-04 10:24:21 发布

转载

最新推荐文章于 2025-08-04 10:24:21 发布

·

1.8w 阅读

·

7

·

35

JAVA-网络编程

专栏收录该内容

3 篇文章

订阅专栏

本文详细介绍了IP地址和端口的基本概念,包括IP地址的组成、表示方法及特殊用途的IP地址,如本地回环地址。此外,还介绍了如何通过Java程序获取本机IP地址、判断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.net.InetAddress;

import java.net.UnknownHostException;

public class TestSocket {

public static void main(String[] args) throws UnknownHostException {

InetAddress host = InetAddress.getLocalHost();

String ip =host.getHostAddress();

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.getRuntime().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.getRuntime().exec("ping " + "192.168.2.106");

BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line = null;

StringBuilder sb = new StringBuilder();

while ((line = br.readLine()) != null) {

if (line.length() != 0)

sb.append(line + "\r\n");

}

System.out.println("本次指令返回的消息是:");

System.out.println(sb.toString());

}

}判断本网段有多少可用的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.net.InetAddress;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import java.util.concurrent.LinkedBlockingQueue;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.atomic.AtomicInteger;

public class TestSocket {

public static void main(String[] args) throws IOException, InterruptedException {

InetAddress host = InetAddress.getLocalHost();

String ip = host.getHostAddress();

String ipRange = ip.substring(0, ip.lastIndexOf('.'));

System.out.println("本机ip地址:" + ip);

System.out.println("网段是: " + ipRange);

List ips = Collections.synchronizedList(new ArrayList<>());

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 15, 60, TimeUnit.SECONDS,

new LinkedBlockingQueue());

AtomicInteger number = new AtomicInteger();

for (int i = 0; i < 255; i++) {

String testIP = ipRange + "." + (i + 1);

threadPool.execute(new Runnable() {

@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.getRuntime().exec("ping -n 1 " + ip);

BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line = null;

StringBuilder sb = new StringBuilder();

while ((line = br.readLine()) != null) {

if (line.length() != 0)

sb.append(line + "\r\n");

}

//当有TTL出现的时候,就表示连通了

reachable = sb.toString().contains("TTL");

br.close();

return reachable;

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

return false;

}

}

}

🌸 相关推荐 🌸

旧事文摘:清宫戏,太监常说的“喳” 与“嗻”有什么区别?
阿根廷夺冠女球迷露奶庆祝 是否面临惩罚掀议论
测测你在《魔戒》系列里属于哪个种族?
365bet娱乐场在线

测测你在《魔戒》系列里属于哪个种族?

📅 06-28 👀 966