`
liyebing
  • 浏览: 58055 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

分布式服务框架之NIO(一)

 
阅读更多

    NIO在实现分布式服务框架中非阻塞高并发的服务器端功能十分有用。抽空学了下,下面的学习过程中接触到的代码示例,这些代码基本演示了NIO的最基本的一些特性。

  

    (一)Buffer:

     代码一:演示直接缓冲区的使用

  

import java.nio.ByteBuffer;

public class ByteBufferDemo01 {

    public static void main(String[] args) {
        //直接缓冲区
        ByteBuffer buf = ByteBuffer.allocateDirect(10);
        byte temp[] = { 1, 2, 3 };
        buf.put(temp);
        buf.flip();

        System.out.print("主缓冲区中的内容:");
        while (buf.hasRemaining()) {
            int x = buf.get();
            System.out.print(x + "、");
        }
    }
}

 

    代码二:演示缓冲区的基本使用

   

import java.nio.IntBuffer;

public class IntBufferDemo01 {
    public static void main(String[] args) {
        // 准备出10个大小的缓冲区
        IntBuffer buf = IntBuffer.allocate(10);
        System.out.print("1、写入数据之前的position、limit和capacity:");
        System.out.println("position = " + buf.position() + ",limit = " + buf.limit()
                           + ",capacty = " + buf.capacity());

        int temp[] = { 1, 2, 3 };
        buf.put(5);
        buf.put(temp);
        System.out.print("2、写入数据之后的position、limit和capacity:");
        System.out.println("position = " + buf.position() + ",limit = " + buf.limit()
                           + ",capacty = " + buf.capacity());
        System.out.println();

        //重设缓冲区
        buf.flip();
        System.out.print("3、准备输出数据时的position、limit和capacity:");
        System.out.println("position = " + buf.position() + ",limit = " + buf.limit()
                           + ",capacty = " + buf.capacity());
        System.out.print("缓冲区中的内容:");
        while (buf.hasRemaining()) {
            int x = buf.get();
            System.out.print(x + "、");
        }
    }
}

 

   代码三:子缓冲区的使用

  

import java.nio.IntBuffer;

public class IntBufferDemo02 {

    public static void main(String[] args) {
        //创建缓冲区,并初始化
        IntBuffer buf = IntBuffer.allocate(10);
        IntBuffer sub = null;
        for (int i = 0; i < 10; i++) {
            buf.put(i * 2 + 1);
        }

        //需要通过slice() 创建子缓冲区,可通过子缓冲区修改主缓冲区内容
        buf.position(2);
        buf.limit(6);
        sub = buf.slice();
        for (int i = 0; i < sub.capacity(); i++) {
            int temp = sub.get(i);
            sub.put(temp - 1);
        }

        //重设缓冲区
        buf.flip();
        buf.limit(buf.capacity());
        System.out.print("主缓冲区中的内容:");
        while (buf.hasRemaining()) {
            int x = buf.get();
            System.out.print(x + " 、");
        }
    }
}

 

   代码四:只读缓冲区

  

import java.nio.IntBuffer;

public class IntBufferDemo03 {
    public static void main(String[] args) {
        //准备出10个大小的缓冲区,并初始化
        IntBuffer buf = IntBuffer.allocate(10);
        IntBuffer read = null;
        for (int i = 0; i < 10; i++) {
            buf.put(2 * i + 1);
        }
        
        // 创建只读缓冲区
        read = buf.asReadOnlyBuffer();

        // 重设缓冲区
        read.flip();
        System.out.print("主缓冲区中的内容:");
        while (read.hasRemaining()) {
            int x = read.get();
            System.out.print(x + "、");
        }
        
        //修改,错误
       // read.put(30) ;  
    }
}

 

 

 

 

 

   (二)Channel

 

   代码一:通道写入文件

   

import java.io.File;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FileChannelDemo01 {

    public static void main(String[] args) throws Throwable {
        //初始化
        String infos[] = { "test1", "test2", "test3" };
        FileOutputStream output = new FileOutputStream("D:" + File.separator + "out.txt");

        //读取
        FileChannel fout = output.getChannel();
        ByteBuffer buf = ByteBuffer.allocate(1024);
        for (String info : infos) {
            buf.put(info.getBytes());
        }

        //重设缓冲区(非常重要)
        buf.flip();

        //写入
        fout.write(buf);
        fout.close();
        output.close();
    }

}

 

  代码二:通道的双向性,可读和可写

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FileChannelDemo02 {

    /**
     * 通道是双向的,可读,可写
     * 
     * @param args
     * @throws Throwable
     */
    public static void main(String[] args) throws Throwable {
        File file1 = new File("d:" + File.separator + "out.txt");
        File file2 = new File("d:" + File.separator + "in.txt");

        FileInputStream input = null;
        FileOutputStream output = null;
        output = new FileOutputStream(file2);
        input = new FileInputStream(file1);

        FileChannel fout = output.getChannel();
        FileChannel fin = input.getChannel();

        ByteBuffer buf = ByteBuffer.allocate(1024);
        while ((fin.read(buf)) != -1) {
            buf.flip();
            fout.write(buf);
            buf.clear();
        }
        fin.close();
        fout.close();
        output.close();
    }
}

 

  代码三:MappedByteBuffer的使用

  

import java.io.File;
import java.io.FileInputStream;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class FileChannelDemo03 {

    public static void main(String[] args) throws Throwable {
        File file = new File("d:" + File.separator + "mldn.txt");
        FileInputStream input = null;
        input = new FileInputStream(file);
        FileChannel fin = null; // 定义输入的通道
        fin = input.getChannel(); // 得到输入的通道
        MappedByteBuffer mbb = null;
        mbb = fin.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
        byte data[] = new byte[(int) file.length()]; // 开辟空间接收内容
        int foot = 0;
        while (mbb.hasRemaining()) {
            data[foot++] = mbb.get(); // 读取数据
        }
        System.out.println(new String(data)); // 输出内容
        fin.close();
        input.close();
    }
}

  

 

   

   (三)Charset

    代码一:编码和解码

   

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;

public class CharsetEnDeDemo {

    /**
     * 编码和解码操作
     * @param args
     */
    public static void main(String[] args) throws Throwable{
        Charset utf=Charset.forName("UTF-8");
        //得到编码器和解码器
        CharsetEncoder encoder=utf.newEncoder();
        CharsetDecoder decoder=utf.newDecoder();
        
        CharBuffer cb=CharBuffer.wrap("NIO可以用来构建高性能服务器");
        //编码和解码
        ByteBuffer buf=encoder.encode(cb);
        System.out.println(decoder.decode(buf));
    }

 

  代码二:获取全部可用的字符集

 

import java.nio.charset.Charset;
import java.util.Map;
import java.util.SortedMap;

public class GetAllCharsetDemo {

    public static void main(String[] args) {
        //得到全部可用的字符集
        SortedMap<String, Charset> all = Charset.availableCharsets();
        for (Map.Entry<String, Charset> entry : all.entrySet()) {
            System.out.println(entry.getKey() + " --->" + entry.getValue());
        }
    }

}

 

  

   (四)FileLock

    代码一:文件独占锁的使用

    

import java.io.File;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class FileLockDemo {

    public static void main(String[] args) throws Throwable {
        File file = new File("d:" + File.separator + "out.txt");
        FileOutputStream output = null;
        output = new FileOutputStream(file, true);

        FileChannel fout = output.getChannel();
        FileLock lock = fout.tryLock();

        if (lock != null) {
            System.out.println(file.getName() + "文件锁定30秒");
            Thread.sleep(30000);
            lock.release();
            System.out.println(file.getName() + "文件解除锁定");
        }
        fout.close();
        output.close();
    }

}

 

  

   (五)selector

    代码一:无阻塞服务端代码示例

   

import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;

public class DataServer {

    /**
     * 
     * @param args
     */
    public static void main(String[] args) throws Throwable {
        int ports[] = { 8000, 8001, 8002, 8003, 8005, 8006 }; // 表示五个监听端口
        Selector selector = Selector.open(); // 通过open()方法找到Selector
        for (int i = 0; i < ports.length; i++) {
            ServerSocketChannel initSer = null;
            initSer = ServerSocketChannel.open(); // 打开服务器的通道
            initSer.configureBlocking(false); // 服务器配置为非阻塞
            ServerSocket initSock = initSer.socket();
            
            InetSocketAddress address = null;
            address = new InetSocketAddress(ports[i]); // 实例化绑定地址
            initSock.bind(address); // 进行服务的绑定
            
            initSer.register(selector, SelectionKey.OP_ACCEPT); // 等待连接
            System.out.println("服务器运行,在" + ports[i] + "端口监听");
        }
        // 要接收全部生成的key,并通过连接进行判断是否获取客户端的输出
        int keysAdd = 0;
        while ((keysAdd = selector.select()) > 0) { // 选择一组键,并且相应的通道已经准备就绪
            Set<SelectionKey> selectedKeys = selector.selectedKeys();// 取出全部生成的key
            Iterator<SelectionKey> iter = selectedKeys.iterator();
            while (iter.hasNext()) {
                SelectionKey key = iter.next(); // 取出每一个key
                if (key.isAcceptable()) {
                    ServerSocketChannel server = (ServerSocketChannel) key.channel();
                    SocketChannel client = server.accept(); // 接收新连接
                    client.configureBlocking(false);// 配置为非阻塞
                    ByteBuffer outBuf = ByteBuffer.allocateDirect(1024); //
                    outBuf.put(("当前的时间为:" + new Date()).getBytes()); // 向缓冲区中设置内容
                    outBuf.flip();
                    client.write(outBuf); // 输出内容
                    client.close(); // 关闭
                }
            }
            selectedKeys.clear(); // 清楚全部的key
        }
    }
}

 

 

分享到:
评论

相关推荐

    分布式服务框架的设计与实现 (2).pdf

    分布式服务框架是构建分布式系统的一项核心技术,它通过设计和实现一种服务框架来提供简洁高效的调用服务,而不对业务系统造成入侵。在互联网技术快速发展的今天,分布式服务框架成为了解决大型应用中业务功能不断...

    开源分布式服务框架Dubbo调研报告

    分布式服务框架Dubbo是阿里巴巴开源的一款高性能、轻量级的服务治理框架,旨在提高微服务架构下的服务调用效率,提供服务发现、流量控制、容错重试等核心功能。本调研报告将深入探讨Dubbo的核心特性、设计理念以及...

    dubbo 分布式服务框架 开发者学习文档 PDF格式

    《Dubbo分布式服务框架开发者学习文档》是一份深入解析Dubbo技术体系的重要资料,它涵盖了Dubbo的核心功能和实现机制,对于理解并掌握这个流行的Java分布式服务框架具有极高的价值。Dubbo,作为阿里巴巴开源的一款高...

    Dubbo阿里巴巴分布式服务框架

    《Dubbo:阿里巴巴分布式服务框架详解》 Dubbo,源自阿里巴巴,是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、以及服务自动注册与发现。作为企业级...

    Dubbo-RPC分布式服务框架.pptx

    Dubbo 是阿里巴巴开发的一个分布式服务框架,每天为2千多个服务提供大于30亿次的访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。 Dubbo 最新的版本是 2.5.3。 Dubbox 是当当网基于 2.5.3 版本的扩展。 ...

    分布式服务框架dubbo介绍.pdf

    Dubbo是一款高性能、透明化的远程服务调用框架,同时也提供了SOA(面向服务的架构)的服务治理方案。它通过采用NIO通信和序列化机制,以及灵活的容错策略和负载均衡策略,为分布式系统提供了有力的支撑。 在分布式...

    Java Netty 分布式开发 框架

    Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端,是基于Java NIO的异步非阻塞的网络编程框架。Netty在内部实现了自己的线程模型,支持多种协议,包括UDP、TCP、...

    手把手教你写 轻量级分布式 RPC 框架

    非常好的 轻量级分布式 RPC 框架 学习资料 根据以上技术需求,我们可使用如下技术选型: Spring:它是最强大的依赖注入框架,也是业界的权威标准。 Netty:它使 NIO 编程更加容易,屏蔽了 Java 底层的 NIO 细节。 ...

    分布式RPC框架Apache Dubbo

    分布式RPC框架Apache Dubbo是阿里巴巴开源的一款高性能、轻量级的Java远程调用框架,它致力于提供简单、高效、可扩展的服务发现与调用机制。本文将深入探讨Dubbo的核心特性,包括服务注册中心Zookeeper的安装使用、...

    0729分布式通信框架-RMI1

    在分布式系统中,分布式通信框架起着至关重要的作用,它们使得不同的计算机节点能够相互通信并协同工作。"0729分布式通信框架-RMI1"的主题主要围绕分布式架构、TCP/IP协议、序列化、HTTP与HTTPS协议以及RMI(Remote ...

    基于java的分布式爬虫框架.zip

    【标题】"基于Java的分布式爬虫框架"指的是使用Java编程语言实现的一种能够在多台机器上协同工作的网络爬虫系统。这种框架设计的目标是高效、可扩展和容错性强,适用于大规模网页抓取任务。 在Java中实现分布式爬虫...

    基于netty轻量的高性能分布式RPC服务框架.zip

    在本文中,我们将深入探讨如何利用Netty构建一个轻量且高性能的分布式RPC(Remote Procedure Call)服务框架。 RPC允许在分布式系统中进行远程调用,仿佛调用本地方法一样,极大地简化了分布式服务的开发。Netty...

    基于Java的源码-分布式缓存框架 SwarmCache.zip

    SwarmCache是一个基于Java实现的分布式缓存框架,它的设计目标是提供一个简单、高效且易于扩展的解决方案。本文将深入探讨SwarmCache的核心概念、设计原理以及在实际开发中的应用。 首先,SwarmCache的设计理念源自...

    高性能的分布式服务框架Dubbo

    官网:http://dubbo.io/,DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及作为SOA服务治理的方案,它是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,...

    分布式框架资源专题资料

    分布式框架资源专题资料涵盖了一系列关于分布式系统、Zookeeper、云原生以及Netty网络库的深入讲解。这些主题都是IT行业中极为重要的知识点,对于构建高效、可扩展的现代应用程序至关重要。 1. **分布式系统**:...

    Redkale 1.9.4 Java 分布式微服务框架.zip

    Redkale是一款基于Java开发的高性能、轻量级的分布式微服务框架,旨在提供一套简单易用、功能全面、扩展性强的解决方案,帮助企业快速构建分布式系统。在1.9.4版本中,Redkale持续优化了其核心特性和性能,以满足日...

    dubbo分布式服务架构

    Dubbo是一个高性能、轻量级的Java开源分布式服务框架,由阿里巴巴公司开发并维护,它致力于提供简单易用且功能强大的服务发现、调用、负载均衡和服务治理等能力。Dubbo的核心设计理念是“面向接口的编程”,使得服务...

    dubbo分布式框架学习资料(内含实例)

    这个压缩包文件包含了关于Dubbo分布式框架的学习资料和实例,对于深入理解并掌握Dubbo有极大的帮助。下面我们将详细探讨Dubbo的核心概念、功能、工作原理以及如何通过实例进行学习。 一、Dubbo核心概念 1. 服务...

    阿里分布式框架dubbo学习

    总之,Dubbo作为一款强大的分布式框架,为现代企业级应用提供了高效、灵活的服务治理方案。通过对服务提供者、消费者、注册中心等核心组件的理解和合理使用,我们可以构建出稳定、可扩展的分布式系统。同时,掌握...

Global site tag (gtag.js) - Google Analytics