我正在接受来自客户端的连接,然后将该连接的套接字传递给另一个对象,但是,该套接字需要是非阻塞的。我正在尝试使用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");
  }
}

最佳答案

两件事情:

  • 如果您正在监听连接,为什么不使用 ServerSocket
  • 如果要接受多个客户端,则要使用循环。

  • 多客户端服务器的基本结构为:
    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/

    10-16 23:27