在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

JAVA NIO 基础学习

2016-12-20 13:15| 发布者: zhangjf| 查看: 492| 评论: 0

摘要: 服务端 监听 package com.hrd.netty.demo.jnio;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.InetSocketAddress;import java.nio.ByteBuffer; ...
服务端 监听
  1. package com.hrd.netty.demo.jnio;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.InetSocketAddress;
  6. import java.nio.ByteBuffer;
  7. import java.nio.channels.SelectionKey;
  8. import java.nio.channels.Selector;
  9. import java.nio.channels.ServerSocketChannel;
  10. import java.nio.channels.SocketChannel;
  11. import java.util.Iterator;
  12. /**
  13. * Created by hurd on 2016/1/26.
  14. */
  15. public class NioServerListener extends Thread {
  16. protected Selector selector;
  17. protected SocketChannel socketChannel;
  18. public NioServerListener(Selector selector){
  19. this.selector = selector;
  20. }
  21. @Override
  22. public void run(){
  23. try {
  24. //while循环监听事件
  25. while(true){
  26. //阻塞
  27. selector.select();
  28. //获取选择器中已经就绪的SelectionKey集合
  29. Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
  30. //遍历
  31. while (iterator.hasNext()){
  32. SelectionKey key = iterator.next();
  33. //删除
  34. iterator.remove();
  35. //接受连接就绪事件
  36. if(key.isAcceptable()){
  37. ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
  38. socketChannel = ssc.accept();
  39. //套接字通道设置为非阻塞模式
  40. socketChannel.configureBlocking(false);
  41. //向socket通道 注册读就绪事件
  42. socketChannel.register(selector, SelectionKey.OP_READ);
  43. }else if(key.isReadable()){
  44. //SocketChannel socketChannel = (SocketChannel) key.channel();
  45. ByteBuffer byteBuffer = ByteBuffer.allocate(100);
  46. int len = socketChannel.read(byteBuffer);
  47. /*StringBuffer dataBuffer= new StringBuffer();
  48. while( -1 != len){
  49. //将写模式变为读模式
  50. byteBuffer.flip();
  51. CharBuffer charBuffer = byteBuffer.asCharBuffer();
  52. dataBuffer.append(charBuffer.array());
  53. byteBuffer.clear();
  54. len = socketChannel.read(byteBuffer);
  55. }*/
  56. byteBuffer.flip();
  57. //读取完毕
  58. if(byteBuffer.limit()>0){
  59. System.out.println("来自服务端消息:" + new String(byteBuffer.array()).trim());
  60. }
  61. }else if(key.isWritable()){
  62. //暂时还没想明白这个写就绪事件干嘛用的。。。
  63. System.out.println("暂不处理");
  64. }
  65. }
  66. }
  67. } catch (IOException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. public static void main(String[] args) throws IOException {
  72. //打开一个 ServerSocketChannel实例 并设置为false
  73. ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
  74. serverSocketChannel.configureBlocking(false);
  75. //绑定ip +端口
  76. serverSocketChannel.socket().bind(new InetSocketAddress("127.0.0.1",1024));
  77. //打开一个选择器
  78. Selector selector = Selector.open();
  79. //向 serverSocketChannel 注册 接收就绪事件
  80. serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
  81. //开启线程进行监听
  82. NioServerListener listener = new NioServerListener (selector);
  83. listener.start();
  84. //进行控制太输入 写事件 进行通讯
  85. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
  86. while(true){
  87. //java IO 阻塞读取数据
  88. String data = bufferedReader.readLine();
  89. if("exit".equals(data)){
  90. if(null != listener.socketChannel){
  91. listener.socketChannel.close();
  92. }
  93. System.out.println("主线程关闭.....");
  94. System.exit(0);
  95. }
  96. ByteBuffer buffer = ByteBuffer.wrap(data.getBytes());
  97. listener.socketChannel.write(buffer);
  98. }
  99. }
  100. }
复制代码
客户端 监听
  1. package com.hrd.netty.demo.jnio;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.InetSocketAddress;
  6. import java.nio.ByteBuffer;
  7. import java.nio.channels.SelectionKey;
  8. import java.nio.channels.Selector;
  9. import java.nio.channels.SocketChannel;
  10. import java.util.Iterator;
  11. /**
  12. * Created by hurd on 2016/1/26.
  13. */
  14. public class NioClientListener extends Thread {
  15. public Selector selector;
  16. public SocketChannel socketChannel;
  17. public NioClientListener(Selector selector){
  18. this.selector = selector;
  19. }
  20. @Override
  21. public void run(){
  22. try {
  23. //while循环监听事件
  24. while(true){
  25. //阻塞
  26. selector.select();
  27. //获取选择器中已经就绪的SelectionKey集合
  28. Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
  29. //遍历
  30. while (iterator.hasNext()){
  31. SelectionKey key = iterator.next();
  32. //删除
  33. iterator.remove();
  34. socketChannel = (SocketChannel) key.channel();
  35. //套接字通道设置为非阻塞模式
  36. socketChannel.configureBlocking(false);
  37. //连接就绪事件
  38. if(key.isConnectable()){
  39. socketChannel = (SocketChannel) key.channel();
  40. //判断连接是否完成
  41. int i =0;
  42. while(! socketChannel.finishConnect()){
  43. if(++i>10){
  44. throw new RuntimeException("socket连接超时");
  45. }
  46. System.out.println("sock连接未完成,等待中....");
  47. try {
  48. Thread.sleep(1000);
  49. } catch (InterruptedException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. //向socket通道 注册读就绪事件
  54. socketChannel.register(selector, SelectionKey.OP_READ);
  55. }else if(key.isReadable()){
  56. //SocketChannel socketChannel = (SocketChannel) key.channel();
  57. ByteBuffer byteBuffer = ByteBuffer.allocate(100);
  58. int len = socketChannel.read(byteBuffer);
  59. /*StringBuffer dataBuffer= new StringBuffer();
  60. while( -1 != len){
  61. //将写模式变为读模式
  62. byteBuffer.flip();
  63. CharBuffer charBuffer = byteBuffer.asCharBuffer();
  64. dataBuffer.append(charBuffer.array());
  65. byteBuffer.clear();
  66. len = socketChannel.read(byteBuffer);
  67. }*/
  68. byteBuffer.flip();
  69. //读取完毕
  70. if(byteBuffer.limit()>0){
  71. System.out.println("来自服务端消息:" + new String(byteBuffer.array()).trim());
  72. }
  73. }else if(key.isWritable()){
  74. //暂时还没想明白这个写就绪事件干嘛用的。。。
  75. System.out.println("暂不处理");
  76. }
  77. }
  78. }
  79. } catch (IOException e) {
  80. e.printStackTrace();
  81. }
  82. }
  83. public static void main(String[] args) throws IOException {
  84. //打开一个SocketChannel实例 并设置为false
  85. SocketChannel socketChannel = SocketChannel.open();
  86. socketChannel.configureBlocking(false);
  87. //绑定ip +端口
  88. socketChannel.connect(new InetSocketAddress("127.0.0.1",1024));
  89. //打开一个选择器
  90. Selector selector = Selector.open();
  91. //向 serverSocketChannel 注册 连接就绪事件
  92. socketChannel.register(selector, SelectionKey.OP_CONNECT);
  93. //开启线程进行监听
  94. NioClientListener listener = new NioClientListener (selector);
  95. listener.start();
  96. //进行控制太输入 写事件 进行通讯
  97. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
  98. while(true){
  99. //java IO 阻塞读取数据
  100. String data = bufferedReader.readLine();
  101. if("exit".equals(data)){
  102. socketChannel.close();
  103. System.out.println("主线程关闭.....");
  104. System.exit(0);
  105. }
  106. ByteBuffer buffer = ByteBuffer.wrap(data.getBytes());
  107. socketChannel.write(buffer);
  108. }
  109. }
  110. }
复制代码

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-8 08:30

Copyright 2015-2025 djqfx

返回顶部