现在的位置: 首页 > 综合 > 正文

充分利用资源,非阻塞的Socket链接

2014年02月02日 ⁄ 综合 ⁄ 共 1706字 ⁄ 字号 评论关闭
我们建立普通的Socket时,我们必须等待连接建立成功,才能继续下一步工作,比如常见的代码如下
  1.       System.out.println("普通建立连接....");
  2.       Socket socket = new Socket("www.java2000.net"80);
  3.       System.out.println(socket.isConnected());

我们的代码,必须等待第二行完成后,才能继续运行。如果对方服务器比较慢,则会有比较长的时间处于阻塞状态。

下面的代码使用SocketChannel实现了非阻塞的链接。

  1. package net.java2000.nio;
  2. import java.io.IOException;
  3. import java.net.InetSocketAddress;
  4. import java.net.Socket;
  5. import java.nio.channels.SocketChannel;
  6. /**
  7.  * 非阻塞的Socket链接。<br>
  8.  * 可以在链接建立期间做一些别的操作。
  9.  * 
  10.  * @author 赵学庆,Java世纪网(java2000.net)
  11.  * 
  12.  */
  13. public class SocketNonBlock {
  14.   /**
  15.    * 创建一个非阻塞的Socket通道。
  16.    * 
  17.    * @param hostName
  18.    *          主机
  19.    * @param port
  20.    *          端口
  21.    * @return Socket端口
  22.    * @throws IOException
  23.    */
  24.   public static SocketChannel createSocketChannel(String hostName, int port)
  25.       throws IOException {
  26.     SocketChannel sChannel = SocketChannel.open();
  27.     sChannel.configureBlocking(false);
  28.     sChannel.connect(new InetSocketAddress(hostName, port));
  29.     return sChannel;
  30.   }
  31.   public static void main(String[] args) {
  32.     try {
  33.       System.out.println("普通建立连接....");
  34.       Socket socket = new Socket("www.java2000.net"80);
  35.       System.out.println(socket.isConnected());
  36.       // 创建链接
  37.       SocketChannel sChannel = createSocketChannel("www.java2000.net"80);
  38.       // 可以通过判断是否连接,在链接成功建立前做一些其它的事情
  39.       while (!sChannel.finishConnect()) {
  40.         System.out.println("等待非阻塞连接建立....");
  41.         try {
  42.           Thread.sleep(10);
  43.         } catch (InterruptedException e) {
  44.           e.printStackTrace();
  45.         }
  46.       }
  47.       System.out.println(sChannel.isConnected());
  48.     } catch (IOException e) {
  49.       e.printStackTrace();
  50.     }
  51.   }
  52. }

运行结果
普通建立连接....
true
等待非阻塞连接建立....
等待非阻塞连接建立....
true

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

抱歉!评论已关闭.