5

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

5 回答 5

10

两件事情:

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

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

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

如果问题是阻塞accept()呼叫,那就是accept()这样:它阻塞等待连接。如果这是一个问题,我建议您有一个单独的线程来接受连接。

请参阅编写套接字的服务器端

于 2009-11-09T01:39:29.767 回答
1

如果您正在寻找非阻塞套接字,我的建议是在 NIO 包中使用 Selectors 和 ServerSocketChannels。

http://java.sun.com/j2se/1.4.2/docs/guide/nio/

于 2009-11-09T02:30:58.553 回答
1

我希望您的代码在接受调用时阻塞,永远不会进入 configureBlocking 调用。

我通常为每个套接字连接分离一个单独的线程,并让它阻塞直到实际建立/接受连接这允许主线程在等待客户端连接时继续畅通无阻。

于 2009-11-09T01:34:45.603 回答
0

一种方法是在单线程环境中使用 I/O 循环(事件循环)。查看Deft Web 服务器以获取灵感。(尤其是IOLoop中的 start() 方法)

于 2010-10-04T15:49:17.753 回答
0

如果典型的阻塞套接字不能为您提供所需的可用性(每 100 毫秒的连接似乎很紧张)。您应该查看非阻塞套接字。这是一个教程。您还可以查看 Apache MINA以简化此操作。

于 2009-11-09T02:16:47.080 回答