专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » socket阻塞:充分利用资源,非阻塞的Socket链接 »正文

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


总结:
非阻塞链接,可以让我们在等待链接建立期间做一些其它的工作,至少可以用来显示正在连接的一些动画啥的。

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: