4

我有一个用于 JUnit 4.x 的 Java 类。在每个 @Test 方法中,我创建一个新的 HttpServer,使用端口 9090。第一次调用工作找到,但随后的错误“地址已在使用中:绑定”。

这是一个例子:

@Test
public void testSendNoDataHasValidResponse() throws Exception {
    InetSocketAddress address = new InetSocketAddress(9090);
    HttpHandler handler = new HttpHandler() {

        @Override
        public void handle(HttpExchange exchange) throws IOException {
            byte[] response = "Hello, world".getBytes();
            exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.length);
            exchange.getResponseBody().write(response);
            exchange.close();
        }
    };
    HttpServer server = HttpServer.create(address, 1);
    server.createContext("/me.html", handler);
    server.start();

    Client client = new Client.Builder(new URL("http://localhost:9090/me.html"), 20, "mykey").build();

    client.sync();
    server.stop(1);
    assertEquals(true, client.isSuccessfullySynchronized());
}

很明显,HttpServer 只包含在每个方法中,并在结束前停止。我看不到是什么继续保持任何套接字打开。第一个测试通过,随后的测试每次都失败。

有任何想法吗?

用更正的方法编辑:

@Test
public void testSendNoDataHasValidResponse() throws Exception {
    server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 1);
    HttpHandler handler = new HttpHandler() {

        @Override
        public void handle(HttpExchange exchange) throws IOException {
            byte[] response = "Hello, world".getBytes();
            exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.length);
            exchange.getResponseBody().write(response);
            exchange.close();
        }
    };
    server.createContext("/me.html", handler);
    server.start();
    InetSocketAddress address = server.getAddress();
    String target = String.format("http://%s:%s/me.html", address.getHostName(), address.getPort());

    Client client = new Client.Builder(new URL(target), 20, "mykey").build();

    client.sync();
    server.stop(0);
    assertEquals(true, client.isSuccessfullySynchronized());
}
4

3 回答 3

6

果冻的答案是钱。

其他解决方法:

于 2012-05-15T21:03:06.900 回答
3

在重新绑定到特定端口号之前,通常需要等待 2 分钟。运行 netstat 以确认您的服务器的连接是否在 TIME_WAIT 中。如果是这样,您可以在绑定之前使用 SO_REUSEADDR 选项来绕过它。文档在此处适用于 java。

于 2012-05-15T20:08:41.203 回答
0

创建 HttpServer 时,您指定

侦听套接字上允许的最大排队传入连接数

这是1

server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 1);

关联

于 2014-11-18T14:58:44.397 回答