我们建立普通的Socket时,我们必须等待连接建立成功,才能继续下一步工作,比如常见的代码如下
- System.out.println("普通建立连接....");
- Socket socket = new Socket("www.java2000.net", 80);
- System.out.println(socket.isConnected());
我们的代码,必须等待第二行完成后,才能继续运行。如果对方服务器比较慢,则会有比较长的时间处于阻塞状态。
下面的代码使用SocketChannel实现了非阻塞的链接。
- package net.java2000.nio;
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import java.net.Socket;
- import java.nio.channels.SocketChannel;
- /**
- * 非阻塞的Socket链接。<br>
- * 可以在链接建立期间做一些别的操作。
- *
- * @author 赵学庆,Java世纪网(java2000.net)
- *
- */
- public class SocketNonBlock {
- /**
- * 创建一个非阻塞的Socket通道。
- *
- * @param hostName
- * 主机
- * @param port
- * 端口
- * @return Socket端口
- * @throws IOException
- */
- public static SocketChannel createSocketChannel(String hostName, int port)
- throws IOException {
- SocketChannel sChannel = SocketChannel.open();
- sChannel.configureBlocking(false);
- sChannel.connect(new InetSocketAddress(hostName, port));
- return sChannel;
- }
- public static void main(String[] args) {
- try {
- System.out.println("普通建立连接....");
- Socket socket = new Socket("www.java2000.net", 80);
- System.out.println(socket.isConnected());
- // 创建链接
- SocketChannel sChannel = createSocketChannel("www.java2000.net", 80);
- // 可以通过判断是否连接,在链接成功建立前做一些其它的事情
- while (!sChannel.finishConnect()) {
- System.out.println("等待非阻塞连接建立....");
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- System.out.println(sChannel.isConnected());
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
运行结果
普通建立连接....
true
等待非阻塞连接建立....
等待非阻塞连接建立....
true
总结:
非阻塞链接,可以让我们在等待链接建立期间做一些其它的工作,至少可以用来显示正在连接的一些动画啥的。