簡體   English   中英

無法將套接字設置為非阻塞

[英]Cannot set socket to nonblocking

我試圖與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的兩個(給定的:令人困惑的)概念:

  • (舊)Stream-IO:無論您設置了什么選項,流始終處於阻塞狀態。
  • (新) NIO :如果正確使用,這可以是非阻塞的,但是更復雜,但是您需要使用選擇器而不是自己調用accept。

如果計划使用無阻塞IO,則一定要先通讀文檔,並做一些試驗以正確理解該概念。 但是,一旦您了解了它,就可以編寫非常快速的IO代碼。

這不是一個“ bug”,只是一個編譯錯誤。 您已經發明了一種不存在的方法,因此編譯器不會讓您調用它。 請參閱java.nio.channels.ServerSocketChannel。 與SocketChannel一樣,它確實具有configureBlocking()方法。

但是,鑒於您已編寫的代碼,根本沒有理由設置非阻塞模式。 您所寫的是阻塞模式TCP服務器的典型框架。

另外,當您遇到異常時,不要只打印自己設計的消息。 打印異常隨附的內容。

NIO默認情況下處於阻止狀態,因此您無需進行設置。

我使用阻塞NIO,除非您有成千上萬個連接,否則我建議使用該功能。

我建議您做的是使用像ExecutorService這樣的線程池。

我在嘗試使套接字無阻塞時發現錯誤。

由於您沒有說明錯誤是什么,我懷疑您提供的代碼中沒有該錯誤。

您為什么要使其不阻塞?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM