小编典典
简短地说,不。available()是不可靠的(至少对我来说不是)。我建议java.nio.channels.SocketChannel与Selector和一起使用SelectionKey。该解决方案在某种程度上基于事件,但是比普通套接字更加复杂。
对于客户:
构造套接字通道(socket),打开选择器(selector = Selector.open();)。
使用非阻塞 socket.configureBlocking(false);
注册连接器选择器 socket.register(selector, SelectionKey.OP_CONNECT);
连接 socket.connect(new InetSocketAddress(host, port));
看看是否有新东西 selector.select();
如果“新”表示成功连接,则为OP_READ; 注册选择器。如果“新”指的是可用数据,则只需从套接字读取。
但是,为了使其异步,您需要设置一个单独的线程(尽管套接字被创建为非阻塞的,但无论如何该线程都会阻塞),以检查是否已到达某些线程。
对于服务器,这里有ServerSocketChannel您使用的服务器OP_ACCEPT。
供参考,这是我的代码(客户端),应给您提示:
private Thread readingThread = new ListeningThread();
/**
* Listening thread - reads messages in a separate thread so the application does not get blocked.
*/