socket阻塞:充分利用资源,非阻塞的Socket链接来源: 发布时间:星期一, 2008年10月20日 浏览:264次 评论:0
我们建立普通的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 总结: 非阻塞链接,可以让我们在等待链接建立期间做一些其它的工作,至少可以用来显示正在连接的一些动画啥的。 0
相关文章读者评论发表评论 |