【Java nio】 NonBlocking NIO

  1 package com.slp.nio;
  2
  3 import org.junit.Test;
  4
  5 import java.io.IOException;
  6 import java.net.InetSocketAddress;
  7 import java.nio.ByteBuffer;
  8 import java.nio.channels.SelectionKey;
  9 import java.nio.channels.Selector;
 10 import java.nio.channels.ServerSocketChannel;
 11 import java.nio.channels.SocketChannel;
 12 import java.time.LocalDateTime;
 13 import java.util.Date;
 14 import java.util.Iterator;
 15 import java.util.Scanner;
 16
 17 /**
 18  * Created by sanglp on 2017/3/2.
 19  * 一、使用NIO完成网络通信的三个核心
 20  * 1、通道:负责连接
 21  *     |--java.nio.channels.channel接口
 22  *        |--SelectableChannel
 23  *           |--SocketChannel
 24  *           |--ServerSocketChannel
 25  *           |--DatagramChannel
 26  *
 27  *           |--Pipe.SinkChannel
 28  *           |--Pipe.SourceChannel
 29  * 2、缓冲区:负责数据的存取
 30  * 3、选择器:是SelectableChannel的多路复用器,用于监控SelectableChannel的IO状况
 31  *
 32  */
 33 public class TestNonBlockingNIO {
 34
 35     @Test
 36     public void client() throws IOException {
 37         //获取通道
 38         SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1",9898));
 39         //切换为非阻塞模式
 40       socketChannel.configureBlocking(false);
 41         //分配缓冲区
 42         ByteBuffer buf = ByteBuffer.allocate(1024);
 43         //发送数据给服务端
 44
 45         Scanner scanner = new Scanner(System.in);
 46         while (scanner.hasNext()){
 47             String str = scanner.next();
 48             buf.put((new Date().toString()+"\n"+str).getBytes());
 49             buf.flip();
 50             socketChannel.write(buf);
 51             buf.clear();
 52         }
 53
 54
 55         //关闭通道
 56         socketChannel.close();
 57
 58     }
 59
 60     @Test
 61     public void server() throws IOException {
 62         //获取通道
 63        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
 64         //切换非阻塞模式
 65         serverSocketChannel.configureBlocking(false);
 66         //绑定连接
 67         serverSocketChannel.bind(new InetSocketAddress(9898));
 68         //获取一个选择器
 69         Selector selector = Selector.open();
 70         //将通道注册到选择器上 并且指定监听接收事件
 71         serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
 72         //轮询式的获取选择器上已经准备就绪的事件
 73         while (selector.select()>0){
 74             //获取当前选择器中所有注册的选择键(已就绪的监听事件)
 75             Iterator<SelectionKey> it = selector.selectedKeys().iterator();
 76             while (it.hasNext()){
 77                 //获取准备就绪的事件
 78                 SelectionKey sk = it.next();
 79                 //判断具体是什么事件准备就绪
 80                 if(sk.isAcceptable()){
 81                     //获取额护短连接
 82                     SocketChannel socketChannel = serverSocketChannel.accept();
 83                     //切换非阻塞模式
 84                     socketChannel.configureBlocking(false);
 85                     //将该通道注册到选择器上
 86                     socketChannel.register(selector,SelectionKey.OP_READ);
 87                 }else if(sk.isReadable()){
 88                     //获取当前选择器上读就绪状态的通道
 89                     SocketChannel socketChannel = (SocketChannel) sk.channel();
 90                     //读取数据
 91                     ByteBuffer buffer = ByteBuffer.allocate(1024);
 92                     int len =0;
 93                     while ((len=socketChannel.read(buffer))>0){
 94                         buffer.flip();
 95                         System.out.println(new String(buffer.array(),0,len));
 96                         buffer.clear();
 97                     }
 98                 }
 99                 //取消选择键
100                 it.remove();
101             }
102         }
103     }
104 }
时间: 2024-10-14 09:01:58

【Java nio】 NonBlocking NIO的相关文章

【Java记录】try-with-resources的一个坑

[Java记录]try-with-resources的一个坑 今天处理 AsynchronousFileChannel 时候的一个问题,代码如下: public static void main(String[] args) throws Exception { String filePath = "/home/xe/git/osc/JavaNote/Lang/data/Test.java"; ExecutorService executorService = Executors.ne

【java解惑】前缀自增自减和后缀自增自减问题

    如下代码: public class Example025 { public static void main(String[] args) { int ape = 100; int it = 100; int ape_it = 100; for (int i = 0; i < 100; i++) { ape--; it = it--; ape_it = --ape_it; } System.out.println("ape = " + ape); System.out.

【java web】java执行预编译Groovy脚本

在JVM中运行Groovy类有两种方式: 使用Groovy编译所有的*.groovy为java的*.class文件,把这些*.class文件放在java类路径中,通过java类加载器来加载这些类. 通过groovy类加载器在运行时直接加载*.groovy文件并生成对象.在这种方式下,没有生成任何*.class,但是生成了一个java.lang.Class对象的实例. 下面介绍前一种使用Groovy的方法:编译成java字节码并且作为正常java应用程序运行在java虚拟机上,即预编译模式. 1.

【java解惑】重载构造函数

如下所示代码: public class Example046 { private Example046(Object o) { System.out.println("Object"); } private Example046(double[] dArray) {//2 System.out.println("double array"); } private Example046(String str) {//3 System.out.println(&quo

【java解惑】移位运算符规则

    如下代码: public class Example027 { public static void main(String[] args) { int i = 0; while (-1 << 32 != 0) { i++; } System.out.println(i); } }     结果说明:     将上述程序放到eclipse中,在输出行会有提示"Unreachable code".也就是while循环是死循环无法退出.     结果分析:     Ja

【JAVA学习】struts2 中 Actionsupport 的作用

尊重原创:http://xumiao900.iteye.com/blog/469760 Action 跟 Actionsupport 的区别 当我们在写action的时候,可以实现Action接口,也可以继承Actionsupport这个类.到底这两个有什么区别呢? Action接口有: public static final java.lang.String SUCCESS = "success"; public static final java.lang.String NONE

【JAVA学习】struts2的action中使用session的方法

尊重版权:http://hi.baidu.com/dillisbest/item/0bdc35c0b477b853ad00efac 在Struts2里,如果需要在Action中使用session,可以通过下面两种方式得到1.通过ActionContext class中的方法getSession得到2.Action实现org.apache.struts2.interceptor.SessionAware接口的方式来对session进行操作 下面先看一个采用第一种方式,在action中得到sessi

【java基础】Java反射机制

一.预先需要掌握的知识(java虚拟机)  1)java虚拟机的方法区:  java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区.方法区的主要作用是存储被装载的类 的类型信息,当java虚拟机装载某个类型的时候,需要类装载器定位相应的class文件,然后将其读入到java虚拟机中,紧接着虚拟机提取class 中的类型信息,将这些信息存储到方法区中.这些信息主要包括: 这个类型的全限定名 这个类型的直接超类的全限定名 这个类型是类类型还是接口类型

【Java编程】JDBC注入攻击-Statement 与 PreparedStatement

在上一篇[Java编程]建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement我们介绍了如何使用JDBC驱动建立一个简单的连接,并实现使用Statement和PreparedStatement进行数据库查询,本篇blog将接着上篇blog通过SQL注入攻击比较Statement和PreparedStatement.当然这两者还有很多其他方面的不同,在之后的blog中会继续更新. [Statement查询] 1.在DBH