从SocketChannel读取数据

SocketChannel的读取方式也比较特殊,请看代码。可以直接在 ByteBuffer里面操作。也可以转化为byte[]再转为中文String

  1. package net.java2000.nio;
  2. import java.io.IOException;
  3. import java.net.InetSocketAddress;
  4. import java.nio.ByteBuffer;
  5. import java.nio.channels.SocketChannel;
  6. /**
  7.  * 从SocketChannel读取数据。
  8.  * 
  9.  * @author 赵学庆,Java世纪网(java2000.net)
  10.  * 
  11.  */
  12. public class SocketChannelRead {
  13.   public static SocketChannel createSocketChannel(String hostName, int port)
  14.       throws IOException {
  15.     SocketChannel sChannel = SocketChannel.open();
  16.     sChannel.configureBlocking(false);
  17.     sChannel.connect(new InetSocketAddress(hostName, port));
  18.     return sChannel;
  19.   }
  20.   public static void main(String[] args) {
  21.     ByteBuffer buf = ByteBuffer.allocateDirect(1024);
  22.     byte[] buff = new byte[1024];
  23.     try {
  24.       buf.clear();
  25.       SocketChannel socketChannel = createSocketChannel("163.net"25);
  26.       while (!socketChannel.finishConnect()) {
  27.         System.out.println("等待非阻塞连接建立....");
  28.         try {
  29.           Thread.sleep(10);
  30.         } catch (InterruptedException e) {
  31.           e.printStackTrace();
  32.         }
  33.       }
  34.       int numBytesRead;
  35.       while ((numBytesRead = socketChannel.read(buf)) != -1) {
  36.         if (numBytesRead == 0) {
  37.           // 如果没有数据,则稍微等待一下
  38.           try {
  39.             Thread.sleep(1);
  40.           } catch (InterruptedException e) {
  41.             e.printStackTrace();
  42.           }
  43.           continue;
  44.         }
  45.         // 转到最开始
  46.         buf.flip();
  47.         while (buf.remaining() > 0) {
  48.           System.out.print((char) buf.get());
  49.         }
  50.         // 也可以转化为字符串,不过需要借助第三个变量了。
  51.         // buf.get(buff, 0, numBytesRead);
  52.         // System.out.println(new String(buff, 0, numBytesRead, "UTF-8"));
  53.         // 复位,清空
  54.         buf.clear();
  55.       }
  56.     } catch (IOException e) {
  57.       e.printStackTrace();
  58.     }
  59.   }
  60. }

运行效果
等待非阻塞连接建立....
等待非阻塞连接建立....
220 Coremail SMTP(Anti Spam) System (163net[040302])


你可能感兴趣的:(Java)