我正在用Java创建一个简单的学习项目(使用套接字聊天),今天我遇到了一个问题。也许这一点对某人来说很明显,但我对此感到困惑
了解(至少以下一项):
我创建了一个简单的原始项目,并在一个端口上运行了两个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();
}
}
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();
}
}
}
PS任何建议均受到热烈欢迎
答案 0 :(得分:3)
我创建了一个简单的原始项目,并在一个项目上运行了两个
ServerSocket
港口。在这种情况下,我遇到了一个java.net.BindException
通知“ ...地址已在使用中:JVM_Bind ...”。但在 这样,仅当我的JVM具备以下功能时,我才能检查端口的可用性 抓住了它。如果其他程序监听该端口,我不会 一无所知。
我认为您在误解您的结果。我完全有理由相信,如果您请求的端口已被 any 进程绑定,则您尝试绑定的端口将失败,并显示BindException
。可以照顾
- 我要使用的端口是否已锁定
。至于
- PC上当前打开的可用/可用端口的列表
,有些系统实用程序可以为您提供这些信息,但对您而言毫无用处。发起连接的一端(即客户端)都需要事先知道要尝试连接到哪个端口。它无法从服务器上获取该消息,因为这会带来鸡肉和鸡蛋问题。
通常的方法是服务器侦听由其开发人员或管理员选择的特定端口,并且该端口号是带外提供给客户端的-通常只是因为它是一个标准的知名端口号。这就是大多数基本网络协议的工作方式。例如,默认情况下,HTTP服务器在端口80上运行。如果在服务器尝试绑定到所需端口时碰巧该端口不可用,则表明机器配置错误,服务器无法启动。
另一方面,客户端根本不需要选择端口号。尝试连接服务器时,系统会自动为其选择一个。