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

时间:2013-10-05 19:59:46

标签: java sockets

我正试图掌握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();
}

3 个答案:

答案 0 :(得分:3)

您混淆了Java IO的两个(给定的:相当令人困惑的)概念:

  • (旧)Stream-IO:无论您设置什么选项,Streams都会阻塞。
  • (新)NIO:如果使用正确,可以是非阻止但更复杂,但是您需要使用Selector而不是自己调用accept。

如果您打算使用非阻塞IO,那么您首先应该仔细阅读文档并进行一些实验以正确理解该概念。但是一旦你理解了它,就可以编写非常快速的IO代码。

答案 1 :(得分:2)

这不是'bug',只是编译错误。您已经发明了一种不存在的方法,因此编译器不会让您调用它。请参见java.nio.channels.ServerSocketChannel。它确实有一个configureBlocking()方法,就像SocketChannel一样。

但是,根据您编写的代码,没有理由设置非阻塞模式。您编写的是阻塞模式TCP服务器的典型框架。

此外,当您收到异常时,请不要只打印您自己设计的消息。打印异常附带的那个。

答案 2 :(得分:1)

默认情况下NIO是阻止的,因此您无需进行设置。

我使用阻止NIO,我建议使用它,除非你有数千个连接。

我建议您使用像ExecutorService这样的线程池。

  

我在尝试使套接字无阻塞时发现错误。

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

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