[英]How to make an accepted socket non-blocking in java
我接受来自客户端的连接,然后将连接的套接字传递给另一个对象,但是,该套接字需要是非阻塞的。 我正在尝试使用getChannel().configureBlocking(false)
但这似乎不起作用。 它需要是非阻塞的,因为下面的方法每100ms调用一次。 还有其他方法我应该做这个非阻塞? 谢谢你的帮助!
public void checkForClients() {
DataOutputStream out;
DataInputStream in;
Socket connection;
InetAddress tempIP;
String IP;
try {
connection = serverSocket.accept();
connection.getChannel().configureBlocking(false);
System.err.println("after connection made");
in = new DataInputStream(connection.getInputStream());
out = new DataOutputStream(connection.getOutputStream());
tempIP = connection.getInetAddress();
IP = tempIP.toString();
System.err.println("after ip string");
// create a new user ex nihilo
connectedUsers.add(new ConnectedUser(IP, null, connection, in, out));
System.err.println("after add user");
} catch (SocketTimeoutException e) {
System.err.println("accept timeout - continuing execution");
} catch (IOException e) {
System.err.println("socket accept failed");
}
}
两件事情:
ServerSocket
? 多客户端服务器的基本结构是:
while (true) {
// accept connections
// spawn thread to deal with that connection
}
如果问题是在accept()
调用上阻塞,那么这就是accept()
所做的:它会阻塞等待连接。 如果这是一个问题,我建议你有一个单独的线程来接受连接。
请参阅编写套接字的服务器端 。
我希望你的代码阻止接受调用,永远不会进入configureBlocking调用。
我通常为每个套接字连接分离一个单独的线程,并让它阻塞,直到实际建立/接受连接。这允许主线程在等待客户端连接时继续解除阻塞。
如果你正在寻找非阻塞的sokets,我的建议是使用选择器和ServerSocketChannels与NIO包。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.