Java 无法将套接字设置为非阻塞
我正在努力掌握java网络,让服务器与客户机对话。我在尝试使套接字非阻塞时发现一个错误。有人可以看看我的代码,并试图找到错误吗Java 无法将套接字设置为非阻塞,java,sockets,Java,Sockets,我正在努力掌握java网络,让服务器与客户机对话。我在尝试使套接字非阻塞时发现一个错误。有人可以看看我的代码,并试图找到错误吗 public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; boolean listening = true; try { serverSocket = new ServerSocket(444
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的两个(给定:相当混乱)概念:
- (旧)流IO:无论您可能设置什么选项,流总是阻塞的
- (新):如果使用正确,这可能是非阻塞的,但是更复杂,但是您需要使用,而不是自己调用accept
- (旧)流IO:无论您可能设置什么选项,流总是阻塞的
- (新):如果使用正确,这可能是非阻塞的,但是更复杂,但是您需要使用,而不是自己调用accept
如果您计划使用非阻塞IO,您肯定应该首先阅读文档并进行一些实验,以正确理解该概念。但是,一旦您理解了它,它就允许您编写非常快速的IO代码。NIO在默认情况下是阻塞的,因此您不需要设置它 我使用阻塞NIO,我建议使用它,除非您有数千个连接 我建议您使用一个线程池,比如ExecutorService 我在尝试使套接字非阻塞时发现一个错误 由于您没有说明错误是什么,我怀疑错误不在您提供的代码中
为什么要将其设置为非阻塞?NIO在默认情况下是阻塞的,因此您不需要设置它 我使用阻塞NIO,我建议使用它,除非您有数千个连接 我建议您使用一个线程池,比如ExecutorService 我在尝试使套接字非阻塞时发现一个错误 由于您没有说明错误是什么,我怀疑错误不在您提供的代码中
为什么要使其非阻塞?这不是一个“bug”,只是一个编译错误。您发明了一个不存在的方法,因此编译器不允许您调用它。请参阅java.nio.channels.ServerSocketChannel。它确实有一个configureBlocking()方法,就像SocketChannel一样 但是,考虑到您编写的代码,根本没有理由设置非阻塞模式。您所写的是一个典型的阻塞模式TCP服务器框架
此外,当你遇到异常时,不要只打印你自己设计的消息。打印异常附带的错误。这不是“错误”,只是编译错误。您发明了一个不存在的方法,因此编译器不允许您调用它。请参阅java.nio.channels.ServerSocketChannel。它确实有一个configureBlocking()方法,就像SocketChannel一样 但是,考虑到您编写的代码,根本没有理由设置非阻塞模式。您所写的是一个典型的阻塞模式TCP服务器框架
此外,当你遇到异常时,不要只打印你自己设计的消息。打印异常附带的一个。他没有使用NIO。他试图在非阻塞模式下使用java.net,而不是使用NIO。他试图在非阻塞模式下使用java.net。我的意思是,这是OP的想法,而不是编译的代码。因此,这是有效的java语法,但对于OP想象中的库来说,这是OP的想法,而不是编译的代码。因此,它是有效的java语法,但对于OP想象中的库来说却是如此。