Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets Java 7没有';使用ServerSocket绑定已使用的端口时不会引发BindException_Sockets_Jvm_Java_Serversocket - Fatal编程技术网

Sockets Java 7没有';使用ServerSocket绑定已使用的端口时不会引发BindException

Sockets Java 7没有';使用ServerSocket绑定已使用的端口时不会引发BindException,sockets,jvm,java,serversocket,Sockets,Jvm,Java,Serversocket,我正在Windows7x64上用Java在ServerSocket上进行实验。 我编写了一个小程序,在端口8080上托管一个HTTP服务器,只返回一个静态HTML响应,其中包含类加载器的toString() 我在节目中所做的主要是: 创建服务器套接字 在serverSocket上调用setReuseAddress(false) 将端口8080绑定到此套接字 使用永久循环接受套接字并给出响应 首先,我尝试了JRE 1.6.023,一切都很好:第一个实例启动并正常响应,第二个实例无法启动,因为引发了

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

我在节目中所做的主要是:

  • 创建服务器套接字
  • 在serverSocket上调用setReuseAddress(false)
  • 将端口8080绑定到此套接字
  • 使用永久循环接受套接字并给出响应
  • 首先,我尝试了JRE 1.6.023,一切都很好:第一个实例启动并正常响应,第二个实例无法启动,因为引发了异常:

    Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind
    
    当我尝试使用JRE 1.7.0_5时,发生了意想不到的事情:两个实例都可以成功启动,但只有第一个实例给出响应。第一个实例被杀死后,第二个实例开始响应

    我是否做错了什么,或者这是JRE 7的一个bug

    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();
                }
            }
        }
    }
    

    为了隔离问题,我建议您运行以下测试代码。 . 它是标准API,在这个特定示例中使用ServerSocket,因此它在您的环境(java 7)中失败的可能性很小


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

    也许您可以向我们展示您的代码?+1如果没有代码,就不可能找到源代码error@carlspring如您所愿。ElementalHttpServer在使用构造函数
    ServerSocket(int-port)
    时可以正常工作。我使用构造函数
    ServerSocket()
    并使用
    bind()
    方法指定端口。然后我尝试在我的代码中用
    bind(…)
    交换
    setReuseAddress(false)
    ,现在它在JRE 7中运行良好。但是,我是否遗漏了提到
    bind()
    setReuseAddress()
    顺序很重要的文档?这是我的错,因为
    setReuseAddress()
    上的文档提到:绑定套接字后启用或禁用SO\u REUSEADDR的行为(请参见isBound())没有定义。