0

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

3 回答 3

3

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

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

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

于 2013-10-05T20:04:47.597 回答
2

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

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

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

于 2013-10-05T22:56:42.357 回答
1

NIO 默认是阻塞的,所以你不需要设置它。

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

我建议你做的是使用像 ExecutorService 这样的线程池。

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

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

为什么要让它成为非阻塞的?

于 2013-10-05T20:41:38.607 回答