2

私はWindows7x64上のJavaでServerSocketを実験しています。ポート8080でHTTPサーバーをホストし、クラスローダーのtoString()を含む静的HTML応答のみを返す小さなプログラムを作成しました。

私が主にプログラムでしたこと:

  1. ServerSocketを作成する
  2. serverSocketでsetReuseAddress(false)を呼び出します
  3. ポート8080をこのソケットにバインドします
  4. 永久ループを使用してソケットを受け入れ、応答を返します

最初にJRE1.6.0_23を試してみましたが、すべてが素晴らしいです。最初のインスタンスは起動されて正常に応答しますが、例外がスローされるため、2番目のインスタンスは起動できません。

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

JRE 1.7.0_5を試してみると、予期しないことが起こります。両方のインスタンスを正常に起動できますが、最初のインスタンスのみが応答します。最初のインスタンスがkillされた後、2番目のインスタンスが応答を開始します。

私は何か間違ったことをしていますか、それともこれは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

問題を特定するには、次のテストコードを実行することをお勧めします。 ApacheHttpCore基本サーバー。これは標準APIであり、この特定の例ではServerSocketを使用しているため、ご使用の環境(Java 7)で失敗する可能性はごくわずかです。

失敗した場合は、コードに問題がないことを確認できます。その間、作業マシンのJDK 7でコードを試し、更新します。

于 2012-06-27T03:42:20.733 に答える