Java 无法将套接字设置为非阻塞

Java 无法将套接字设置为非阻塞,java,sockets,Java,Sockets,我正在努力掌握java网络,让服务器与客户机对话。我在尝试使套接字非阻塞时发现一个错误。有人可以看看我的代码,并试图找到错误吗 public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; boolean listening = true; try { serverSocket = new ServerSocket(444

我正在努力掌握java网络,让服务器与客户机对话。我在尝试使套接字非阻塞时发现一个错误。有人可以看看我的代码,并试图找到错误吗

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

    ServerSocket serverSocket = null;
    boolean listening = true;   

    try {
        serverSocket = new ServerSocket(4444);
        serverSocket.configureBlocking(false);
        System.out.println("Server started");
    } catch (IOException e) {
        System.out.println("Could not listen on port: 4444.");
        System.exit(-1);
    }

    while (listening){

        Socket s = serverSocket.accept();

        long id = clients_id++;
        ServerThread st = new ServerThread(s, id);
        addClient(id, st);
        st.start();
    }

    serverSocket.close();
}
您混淆了Java IO的两个(给定:相当混乱)概念:

  • (旧)流IO:无论您可能设置什么选项,流总是阻塞的
  • (新):如果使用正确,这可能是非阻塞的,但是更复杂,但是您需要使用,而不是自己调用accept
如果您计划使用非阻塞IO,您肯定应该首先阅读文档并进行一些实验,以正确理解该概念。但是,一旦您理解了它,它就允许您编写非常快速的IO代码。

您混淆了Java IO的两个(给定:相当混乱)概念:

  • (旧)流IO:无论您可能设置什么选项,流总是阻塞的
  • (新):如果使用正确,这可能是非阻塞的,但是更复杂,但是您需要使用,而不是自己调用accept

如果您计划使用非阻塞IO,您肯定应该首先阅读文档并进行一些实验,以正确理解该概念。但是,一旦您理解了它,它就允许您编写非常快速的IO代码。

NIO在默认情况下是阻塞的,因此您不需要设置它

我使用阻塞NIO,我建议使用它,除非您有数千个连接

我建议您使用一个线程池,比如ExecutorService

我在尝试使套接字非阻塞时发现一个错误

由于您没有说明错误是什么,我怀疑错误不在您提供的代码中


为什么要将其设置为非阻塞?

NIO在默认情况下是阻塞的,因此您不需要设置它

我使用阻塞NIO,我建议使用它,除非您有数千个连接

我建议您使用一个线程池,比如ExecutorService

我在尝试使套接字非阻塞时发现一个错误

由于您没有说明错误是什么,我怀疑错误不在您提供的代码中


为什么要使其非阻塞?

这不是一个“bug”,只是一个编译错误。您发明了一个不存在的方法,因此编译器不允许您调用它。请参阅java.nio.channels.ServerSocketChannel。它确实有一个configureBlocking()方法,就像SocketChannel一样

但是,考虑到您编写的代码,根本没有理由设置非阻塞模式。您所写的是一个典型的阻塞模式TCP服务器框架


此外,当你遇到异常时,不要只打印你自己设计的消息。打印异常附带的错误。

这不是“错误”,只是编译错误。您发明了一个不存在的方法,因此编译器不允许您调用它。请参阅java.nio.channels.ServerSocketChannel。它确实有一个configureBlocking()方法,就像SocketChannel一样

但是,考虑到您编写的代码,根本没有理由设置非阻塞模式。您所写的是一个典型的阻塞模式TCP服务器框架


此外,当你遇到异常时,不要只打印你自己设计的消息。打印异常附带的一个。

他没有使用NIO。他试图在非阻塞模式下使用java.net,而不是使用NIO。他试图在非阻塞模式下使用java.net。我的意思是,这是OP的想法,而不是编译的代码。因此,这是有效的java语法,但对于OP想象中的库来说,这是OP的想法,而不是编译的代码。因此,它是有效的java语法,但对于OP想象中的库来说却是如此。