com.sun.net.httpserver启动前确保端口未被占用
时间: 2024-09-24 13:24:04 浏览: 34
在Java中,使用`com.sun.net.httpserver.HttpServer`(这是一个内部类,通常在JDK中用于创建HTTP服务器)之前,确实需要确保目标端口没有被其他应用占用。一个常见的做法是在启动服务器之前,尝试创建一个临时的`ServerSocket`实例并绑定到该端口,如果抛出异常,那么意味着端口已占。
下面是一个简单的示例:
```java
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;
public class HttpServerRunner {
private final int port;
public HttpServerRunner(int port) {
this.port = port;
}
public void start() {
try (ServerSocket checkSocket = new ServerSocket(port)) {
System.out.println("Port " + port + " is available for HTTP server.");
HttpServer httpServer = HttpServer.create(new InetSocketAddress(port), 0);
httpServer.setExecutor(null); // 使用默认的单线程执行器
httpServer.createContext("/path", new MyHandler()); // 自定义处理器
httpServer.start();
} catch (IOException e) {
if (e.getMessage().contains("BindException")) {
System.err.println("Port " + port + " is already in use, please close the application using it or choose a different port.");
} else {
throw e;
}
}
}
public static void main(String[] args) {
int portToCheck = 8080;
HttpServerRunner runner = new HttpServerRunner(portToCheck);
runner.start();
}
}
class MyHandler { ... } // 此处省略具体的处理器实现
```
在这个示例中,`start`方法首先尝试创建一个`ServerSocket`,如果成功,说明端口可用;如果失败(抛出`IOException`),并且异常信息包含"BindException",说明端口已经被占用,程序会给出提示。
阅读全文