Java 如何知道使用了哪些端口?
我正在用Java创建一个简单的学习项目(使用套接字聊天),今天我遇到了一个问题。也许这一点对某些人来说是显而易见的,但我对此感到困惑 目的 了解(至少以下一项):Java 如何知道使用了哪些端口?,java,sockets,serversocket,Java,Sockets,Serversocket,我正在用Java创建一个简单的学习项目(使用套接字聊天),今天我遇到了一个问题。也许这一点对某些人来说是显而易见的,但我对此感到困惑 目的 了解(至少以下一项): 电脑上当前打开的可用/占用端口列表 我要使用的端口是否已锁定 我试过的 我创建了一个简单的原始项目,并在一个端口上运行了两个ServerSocket。在本例中,我捕获到一个java.net.BindException,通知“…地址已在使用中:JVM_Bind…”。但通过这种方式,只有当JVM捕获了端口可用性时,我才能检查端口可用性。以
ServerSocket
。在本例中,我捕获到一个java.net.BindException
,通知“…地址已在使用中:JVM_Bind…”。但通过这种方式,只有当JVM捕获了端口可用性时,我才能检查端口可用性。以防其他程序监听端口,我对此一无所知。我在下面添加了一个代码
public class Main {
public static void main(String[] args) throws IOException {
MyThread myThread = new MyThread();
ServerSocket serverSocket = new ServerSocket(5940);
myThread.start();
serverSocket.accept();
}
}
PS:欢迎您提供任何建议 我创建了一个简单的原始项目,并在一个上运行了两个
ServerSocket
港口城市在本例中,我捕获了一个带有
通知“…地址已在使用中:JVM_Bind…”。但是在
这样,只有在JVM具有可用性的情况下,我才能检查端口的可用性
抓住了它。如果其他程序监听端口,我不会
你知道吗
我认为你误解了你的结果。我完全有理由相信,如果您请求的端口已经被任何进程绑定,那么您绑定它的尝试将失败,并出现BindException
。那就够了
另一方面,客户端根本不需要选择端口号。当系统尝试连接到服务器时,将自动为其选择一个。您的问题是什么?为什么您认为需要一个可用端口列表?“端口被锁定”是什么意思?
中断()的目的是什么代码>呼叫?附带问题——不要扩展线程,而是根据需要实现可运行或可调用。对于标题中的问题:对于服务器,您无法真正检测和调整,因为客户端需要知道要连接到哪个端口,否则它将找不到服务器。但是,您可以对其进行配置或进行一些查找(在端口中添加1,直到您获得一些免费的内容,并在客户端中执行相同的操作,直到您获得连接)。后者很奇怪,但你偶尔会发现。另一方面,对于客户端,您只需绑定到端口0,机器将从临时范围(免费的内容)分配一个端口。“当前免费开放”在术语上是矛盾的。非常感谢您的回答。据我所知:…我有充分的理由相信,如果您请求的端口已经被任何进程绑定,那么您绑定它的尝试将失败,并出现BindException。。。可以通过不同的进程侦听两个或多个端口。我说的对吗?@MikeBiri,相同或不同的进程在任何给定时间都可能侦听不同的端口,但没有两个进程可以同时侦听同一端口。甚至一个进程也不能让多个套接字同时监听同一个端口,这就是我要说的问题。例如,我的Skype客户端侦听端口8080,同时我可以在JVM中创建一个ServerSocket
,并将其设置为侦听端口8080。并且不会抛出异常…@MikeBiri,那么Skype必须侦听UDP端口8080。您的Java服务器肯定正在侦听TCP端口。两者相互独立,互不冲突。
public class MyThread extends Thread {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(5940);// exception is thrown here
serverSocket.accept();
} catch (IOException e) {
System.err.println("SECOND SERVER");
e.printStackTrace();
interrupt();
}
}
}