网络编程 03:端口的定义、分类,端口映射,通过 Java 实现了 IP 和端口的信息获取

一、概述

记录时间 [2024-12-19]

前置文章

网络编程 01:计算机网络概述,网络的作用,网络通信的要素,以及网络通信协议与分层模型

网络编程 02:IP 地址,IP 地址的作用、分类,通过 Java 实现 IP 地址的信息获取

本文讲述网络编程相关知识------端口,包括端口的定义,分类,以及端口映射等。

同时,文章中通过 Java 编程,实现了 IP 和端口这些网络信息的获取。

通过获取 IP 和端口,同时基于相关的网络协议,我们能实现不同计算机之前的通信。

二、端口定义

端口是传输层的一部分,主要用于区分同一台设备上的不同应用程序或服务。即,不同的进程有不同的端口号。

根据规定:

  • 端口号由一个 16 位的数字表示,范围是 0~65535;
  • 不同的协议(如 TCP,UDP),各自的端口范围都是 0~65535,即,不同协议 + 同一端口号不冲突;
  • 单个协议下,端口号不能冲突。例如,TCP 协议下,同一时间内只有一个进程可以使用 8080 端口。否则就会抛出端口被占用的问题。

三、端口分类

1. 公有端口

公有端口,范围 0~1023,这些端口通常由系统保留,用于常见的网络服务。

  • 21:FTP(文件传输协议)
  • 22:SSH(安全壳层协议)
  • 23:Telent(远程监听)
  • 25:SMTP(简单邮件传输协议)
  • 80:HTTP(超文本传输协议)
  • 443:HTTPS(安全的超文本传输协议)

2. 注册端口

程序注册端口,范围 1024~49151,这些端口分配给用户或程序注册使用,需要注意冲突问题。

  • 3306:MySQL 数据库
  • 8080:Tomcat
  • 1521:Oracle

3. 动态 / 私有端口

动态/私有端口,范围 49151~65535,通常用于临时会话,由操作系统自动分配给客户端应用程序。

  • 当浏览器连接到一个 Web 服务器时,它可能会使用一个动态端口作为源端口。
  • 通过 IDEA 打开网页时,会使用本机的一个动态端口。

四、DOS 命令

1. 查看端口 / 进程

shell 复制代码
# 查看所有端口
netstat -ano
# PID 进程号,不是端口号
# 协议 本地地址 外部地址 状态 PID

# 根据 port 查看指定端口
# | 管道符,用于过滤
netstat -ano|findstr "port"

# 根据 PID 查找进程
tasklist|findstr "PID"

2. 其他

shell 复制代码
# 打开任务管理器
Ctrl + Shift + ESC

# 配置 IP 的映射
# 通过 C:\Windows\System32\drivers\etc\hosts
127.0.0.1       localhost

五、代码实现

1. InetSocketAddress 类

InetSocketAddress 是 Java 网络编程中的一个类,位于 java.net 包中。

它用于表示包含 IP 地址和端口号的套接字地址,通常与 ServerSocketSocketDatagramSocketURL 一起使用,以指定网络连接的目标地址或监听地址。

2. 测试 socket

在 Java 中,通过套接字 socket 获取 IP 地址和 端口号,以此定位一个网络地址。

然后获取这个网络地址中的相关信息,例如,IP 地址,主机名,端口号。

  • getAddress():返回 InetAddress 对象,表示此套接字地址的 IP 地址。
  • getHostName():返回此套接字地址的主机名。如果创建 InetSocketAddress 时提供了 IP 地址而不是主机名,则返回 IP 地址的字符串表示形式。
  • getPort():返回此套接字地址的端口号。
java 复制代码
public class TestInetSocketAddress {
    public static void main(String[] args) {

        // 定位主机 + 端口号
        InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
        InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);

        System.out.println(socketAddress);
        System.out.println(socketAddress2);
        
        // 总的地址
        System.out.println(socketAddress.getAddress());
        // 默认是 IP 地址,想要主机名,可以在 host 系统文件中配置映射
        System.out.println(socketAddress.getHostName());
        // 端口号
        System.out.println(socketAddress.getPort());
    }
}

六、端口映射

端口映射(Port Forwarding)是一种网络技术,用于将外部网络的请求转发到内部网络中的特定设备和端口。

运行在计算机上的应用程序(进程),会有自己的运行端口,其他主机发送过来的消息要想被应用程序成功接收到,除了要通过 IP 地址,还需要定位应用程序的端口

(程序是静止的,进程是程序的运行态)

如下图,在两台不同的主机中,分别跑了两个进程:QQ 和 MSN。

  • 它们给 QQ 进程分配的端口为 8998,给 MSN 进程分配的端口为 7777;
  • 假如主机 1 想通过 QQ 给主机 2 的 QQ 发消息,那么它需要发到主机 2 的端口 8998 上;
  • 由于主机 2 端口 8998 对应 QQ 进程,因此发到端口 8998 的消息会在 QQ 进程上被接收。
  • 如果主机 1 发到了主机 2 的 7777 端口上,消息就会给 7777 端口对应的 MSN 进程,但 MSN 不会接收来自 QQ 的消息,所以这个消息被视为垃圾消息,于是就丢了。(除非 MSN 上有对应的模块可以处理这个消息,给它转到 QQ 对应的地方)

一段历史:QQ 的前身是 QICQ,和微软绑定的 MSN 类似,但由于微软的放任,加上时代的浪潮,QQ 获得了成长空间,逐渐羽翼丰满。可以说,QQ 抓住了这个机会,同时也非常注重风险防范。

参考资料

狂神说 - 网络编程:https://www.bilibili.com/video/BV1LJ411z7vY

Java 8 帮助文档:https://docs.oracle.com/javase/8/docs/api/

相关推荐
chirrupy_hamal12 分钟前
ARP 表、MAC 表、路由表、跨网段 ARP
网络
铁头乔23 分钟前
Java 中如何使用 SSL 连接 IoTDB
java·数据库·开源·ssl·时序数据库·iotdb
Y编程小白27 分钟前
Vue2.0的安装
java·vue
CN.LG36 分钟前
浅谈Java之AJAX
java·开发语言
龙少95432 小时前
【springboot集成knife4j】
java·spring boot·后端
stormjun3 小时前
Java 基于微信小程序的原创音乐小程序设计与实现(附源码,部署,文档)
java·微信小程序·原创音乐小程序·音乐播放小程序
@@@wang4 小时前
Rabbitmq高级特性之消费方确认
java·rabbitmq·java-rabbitmq
m0_748240444 小时前
VScode 开发 Springboot 程序
java·spring boot·后端
致奋斗的我们4 小时前
Linux容器(初学了解)
linux·运维·服务器·网络·容器·shell·openeurler
鹿屿二向箔4 小时前
搭建一个基于Spring Boot的校园台球厅人员与设备管理系统
java·spring boot·后端