我们建立普通的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链接。
* 可以在链接建立期间做一些别的操作。
*/
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
总结:
非阻塞链接,可以让我们在等待链接建立期间做一些其它的工作,至少可以用来显示正在连接的一些动画啥的。
责任编辑:小草