gpt4 book ai didi

java - 如何在java中使接受的套接字成为非阻塞的

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:35 26 4
gpt4 key购买 nike

我正在接受来自客户端的连接,然后将该连接的套接字传递给另一个对象,但是,该套接字需要是非阻塞的。我正在尝试使用 getChannel().configureBlocking(false) 但这似乎不起作用。它需要是非阻塞的,因为下面的方法每 100 毫秒调用一次。还有其他方法可以使它成为非阻塞的吗?感谢您的帮助!

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");
}
}

最佳答案

两件事:

  1. 你为什么不使用 ServerSocket如果您正在监听连接?
  2. 如果您想接受多个客户端,则需要使用循环。

多客户端服务器的基本结构是:

while (true) {
// accept connections
// spawn thread to deal with that connection
}

如果问题是阻塞在 accept() 调用上,那么这就是 accept() 所做的:它阻塞等待连接。如果这是一个问题,我建议您有一个单独的线程来接受连接。

参见 Writing the Server Side of a Socket .

关于java - 如何在java中使接受的套接字成为非阻塞的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1698654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com