我正试图掌握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();
}
答案 0 :(得分:3)
您混淆了Java IO的两个(给定的:相当令人困惑的)概念:
如果您打算使用非阻塞IO,那么您首先应该仔细阅读文档并进行一些实验以正确理解该概念。但是一旦你理解了它,就可以编写非常快速的IO代码。
答案 1 :(得分:2)
这不是'bug',只是编译错误。您已经发明了一种不存在的方法,因此编译器不会让您调用它。请参见java.nio.channels.ServerSocketChannel。它确实有一个configureBlocking()方法,就像SocketChannel一样。
但是,根据您编写的代码,没有理由设置非阻塞模式。您编写的是阻塞模式TCP服务器的典型框架。
此外,当您收到异常时,请不要只打印您自己设计的消息。打印异常附带的那个。
答案 2 :(得分:1)
默认情况下NIO是阻止的,因此您无需进行设置。
我使用阻止NIO,我建议使用它,除非你有数千个连接。
我建议您使用像ExecutorService这样的线程池。
我在尝试使套接字无阻塞时发现错误。
由于您没有说出错误是什么,我怀疑错误不在您提供的代码中。
为什么要将其设为非阻塞?