java中Port端口是怎么回事?有什么用?

本文解释了端口在计算机通信中的作用,通过不同端口区分不同的服务,如HTTP服务通常使用80端口,而SQL Server则使用1433端口。此外还提到了操作系统对1至1024端口的保留情况。

马克-to-win:Port端口是个伟大的发明。否则当我又想访问www.baidu.com获得他的网页,又想同时访问这台机器的sqlserver数据库获取数据库时怎么办呢?这时就用端口来区分。一个在80口,一个在1433端口。一个端口相对于一个程序(先不谈一个程序用多个端口的情况)。一台机器共有65536个端口。Port must be between 0 and 65535 inclusive.
顺便说一句:操作系统保留了使用端口1到端口1024的权力,所以没事别用这些端口。(if you really use 1023, it may not report error. It is only that you should not do like that. Like traffic regulation, you better conform to it. )

 

更多请见:https://blog.youkuaiyun.com/qq_44639795/article/details/102073368

 

Java 中检测端口是否被占用,有两种常见的方法,以下为你详细介绍: #### 方法一:通过 `Socket` 尝试连接指定端口 此方法的核心思路是尝试与指定的 IP 地址和端口建立 `Socket` 连接。若连接成功,表明该端口已被占用;若连接失败并抛出 `IOException` 异常,则说明端口未被占用。以下是示例代码: ```java package mainApp.utils; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; /** * 提供查看端口是否被占用的方法 */ public class NetUtils { public static void main(String[] args) { System.out.println(isLoclePortUsing(8080)); } /** * 查看本机某端口是否被占用 * @param port 端口号 * @return 如果被占用则返回true,否则返回false */ public static boolean isLoclePortUsing(int port){ boolean flag = true; try{ flag = isPortUsing("127.0.0.1", port); }catch (Exception e){ e.printStackTrace(); } return flag; } /** * 根据IP和端口号,查询其是否被占用 * @param host IP * @param port 端口号 * @return 如果被占用,返回true;否则返回false * @throws UnknownHostException IP地址不通或错误,则会抛出此异常 */ public static boolean isPortUsing(String host, int port) throws UnknownHostException { boolean flag = false; InetAddress theAddress = InetAddress.getByName(host); try{ Socket socket = new Socket(theAddress, port); flag = true; } catch (IOException e) { //如果所测试端口号没有被占用,那么会抛出异常,这里利用这个机制来判断 //所以,这里在捕获异常后,什么也不用做 } return flag; } } ``` 上述代码中,`isLoclePortUsing` 方法用于检查本地端口是否被占用,它调用了 `isPortUsing` 方法。`isPortUsing` 方法尝试与指定的 IP 地址和端口建立 `Socket` 连接,若连接成功则返回 `true`,否则返回 `false`[^1]。 #### 方法二:递归查找可用端口 该方法会根据输入的端口号,依次递增递归查询可用端口。若当前端口被占用,则递归查询下一个端口,直至找到可用端口。示例代码如下: ```java package test; import java.io.IOException; import java.net.*; import java.util.Enumeration; public class GetLocalHost { public static void main(String[] args) throws Exception { int inputPort = 8400; System.out.println("输入端口:" + inputPort + ", 递增递归找到可用端口为:" + getUsablePort(inputPort)); } /** * 根据输入端口号,递增递归查询可使用端口 * @param port 端口号 * @return 如果被占用,递归;否则返回可使用port */ public static int getUsablePort(int port) throws IOException { boolean flag = false; Socket socket = null; InetAddress theAddress = InetAddress.getByName("127.0.0.1"); try{ socket = new Socket(theAddress, port); flag = true; } catch (IOException e) { //如果测试端口号没有被占用,那么会抛出异常,通过下文flag来返回可用端口 } finally { if(socket!=null) { //new了socket最好释放 socket.close(); } } if (flag) { //端口被占用,port + 1递归 port = port + 1; return getUsablePort(port); } else { //可用端口 return port; } } } ``` 在上述代码中,`getUsablePort` 方法会尝试连接指定端口,若连接成功则表示端口被占用,会递归调用自身并将端口号加 1 继续查询;若连接失败则表示端口可用,直接返回该端口号[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mark_to_win

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值