2013-10-05 44 views
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(); 
} 

回答

3

你是混亂之二:Java的IO的(因爲相當混亂)的概念:

  • (舊)流-IO:流總是堵,不管你可能會設置的選項。
  • (新增)NIO:如果使用正確,這可以是非阻塞的,但更復雜,但是您需要使用Selector而不是自己調用accept。

如果您計劃使用非阻塞IO,您應該先仔細閱讀文檔並試驗一下,以正確理解該概念。但是,一旦你理解了它,它可以讓你編寫非常快速的IO代碼。

+0

我使用阻塞NIO。 –

1

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

我使用阻塞NIO,我建議使用,除非你有成千上萬的連接。

我建議你做的就是像ExecutorService一樣使用線程池。

我發現嘗試使套接字非阻塞時發生錯誤。

由於您沒有說錯誤是什麼,我懷疑錯誤不在您提供的代碼中。

爲什麼你想讓它非阻塞?

+1

他沒有使用NIO。他試圖在非阻塞模式下使用java.net。 – EJP

+0

@EJP好點。我錯過了。 –

2

這不是一個'錯誤',它只是一個編譯錯誤。你已經發明瞭一種不存在的方法,所以編譯器不會讓你調用它。請參見java.nio.channels.ServerSocketChannel。它有一個configureBlocking()方法,就像SocketChannel一樣。

但是,考慮到您編寫的代碼,根本沒有理由設置非阻塞模式。你寫的是一個阻塞模式TCP服務器的典型框架。

另外,當你得到一個異常時,不要只打印你自己設計的消息。打印出例外情況。

+0

+1錯過了代碼是僞代碼。 –

+0

@PeterLawrey呃?它不是僞代碼。 – EJP

+0

我的意思是這是OP的想法,而不是編譯的代碼。所以這是有效的java語法,但對於OP的想象中的庫。 –