2013-10-05 18 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的想象中的库。 –