2

我正在 Windows 7 x64 上使用 Java 中的 ServerSocket 进行试验。我编写了一个小程序,它在端口 8080 上托管一个 HTTP 服务器,并且只返回一个包含类加载器的 toString() 的静态 HTML 响应。

我在程序中所做的主要是:

  1. 创建一个服务器套接字
  2. 在 serverSocket 上调用 setReuseAddress(false)
  3. 将端口 8080 绑定到此套接字
  4. 使用永远循环来接受套接字并给出响应

首先,我尝试使用 JRE 1.6.0_23,一切都很好:第一个实例启动并正常响应,第二个实例无法启动,因为抛出了异常:

Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind

当我尝试使用 JRE 1.7.0_5 时发生了意想不到的事情:两个实例都可以成功启动,但只有第一个实例给出响应。第一个实例被杀死后,第二个实例开始响应。

我做错了什么还是这是 JRE 7 的错误?

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TestServerSocket {
    private static final String HEADER = "HTTP/1.1 200 OK\r\n" + "Content-type: text/html\r\n"
            + "Connection: close\r\n" + "\r\n";

    private static final int PORT = 8080;

    private static void handle(Socket socket) {
        System.out.println(socket.getInetAddress() + ":" + socket.getPort());
        StringBuilder buffer = new StringBuilder();
        buffer.append(HEADER);
        buffer.append(TestServerSocket.class.getClassLoader());
        try {
            socket.getOutputStream().write(buffer.toString().getBytes());
        } catch (IOException e) {
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
            }
        }

    }

    public static void main(String[] args) throws IOException {
        int port;

        try {
            port = Integer.parseInt(args[0]);
        } catch (Exception e) {
            port = PORT;
        }

        final ServerSocket server = new ServerSocket();
        server.setReuseAddress(false);
        server.bind(new InetSocketAddress(port));

        // Terminator thread, stop when Ctrl-D is entered
        new Thread() {
            public void run() {
                try {
                    while (System.in.read() != 4);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    server.close();
                } catch (IOException e) {
                }
                System.exit(0);
            }
        }.start();

        System.out.println("Listening on: " + port);
        Socket client = null;
        while (true) {
            try {
                client = server.accept();
                handle(client);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
4

1 回答 1

1

为了隔离问题,我建议您运行以下测试代码。 Apache HttpCore 基本服务器。它是标准 API,并在此特定示例中使用 ServerSocket,因此它在您的环境(java 7)上失败的可能性非常小。

如果它失败了,您肯定会知道问题不在于您的代码。同时,我将在我的工作机器上尝试您在 JDK 7 上的代码并进行更新。

于 2012-06-27T03:42:20.733 回答