Java新IO】_Selector

DateServer.java

import java.net.InetSocketAddress ;
import java.net.ServerSocket ;
import java.util.Set ;
import java.util.Iterator ;
import java.util.Date ;
import java.nio.channels.ServerSocketChannel ;
import java.nio.ByteBuffer ;
import java.nio.channels.SocketChannel ;
import java.nio.channels.Selector  ;
import java.nio.channels.SelectionKey  ;
public class DateServer{
    public static void main(String args[]) throws Exception {
        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
        }
        
    }
}

时间: 2024-08-14 12:03:50

Java新IO】_Selector的相关文章

Java -- Java 新 IO -- Java 新IO简介

20.1 Java 新IO简介 20.2 缓冲区与Buffer 例:演示缓冲区的操作流程 Class : IntBufferDemo01 20.2.2 深入缓冲区操作 20.2.3 创建子缓冲区 20.2.4 创建只读缓冲区 20.2.5 创建直接缓冲区 20.3 通道 20.3.1 FileChannel 例:使用输出通道输出内容 Class : FileChannelDemo01 例:使用通道进行读写操作 Class :FileChannelDemo02 20.3.2 内存映射 例:内存映射

java 新IO

传统的IO Java中的InputStream.OutputStream.Reader.Writer这样的面向流的输入输出系统被视为传统的IO.传统的IO是阻塞式的输入输出,并且是通过字节的移动来处理的,即传统的IO一次只能处理一个字节,效率不高. 新IO 新IO和传统的IO有相同的目的,都是用于进行输入输出功能.但是新IO采用内存映射文件的方式来处理输入输出,新IO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样访问文件了,这种方式要比传统的IO快得多. Java中新IO相关的包如

Java新IO

Java从1.4开始引进了对于输入输出的改进,相关类位于java.nio包中.新IO主要有以下几个特性: (1)字符集编码器和解码器 (2)非阻塞的IO (3)内存映射文件 1. 字符集编码器和解码器 Charset类表示不同的字符集,可以使用Charset.forName方法获得指定名称的字符集对象,与Charset相关的类在java.nio.charset包中. (1)编码 将Unicode编码的字符串编码成指定编码的字节序列 Charset cset = Charset.forName("

Java新IO】_通道(Channel)\代码

//****** import java.nio.ByteBuffer ;import java.nio.channels.FileChannel ;import java.io.File ;import java.io.FileOutputStream ;public class FileChannelDemo01{    public static void main(String args[]) throws Exception{        String info[] = {"MLDN

Java新IO】_文件锁\代码 与字符集

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 Exception {        File file = new File("d:&qu

【第20章:Java新IO】_缓冲区与Buffer

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

Java新IO】_缓冲区与Buffer\代码

import java.nio.ByteBuffer ;public class ByteBufferDemo01{    public static void main(String args[]){        ByteBuffer buf = ByteBuffer.allocateDirect(10) ;    // 准备出10个大小的缓冲区        byte temp[] = {1,3,5,7,9} ;    // 设置内容        buf.put(temp) ;    /

Java复习--IO(输入/输出){Java NIO}

http://my.oschina.net/u/2263278/blog/508770中介绍的BufferedReader时提到它的一个特征----当BufferedReader读取输入流中的数据时,如果没有读到有效数据,程序将在此处阻塞该线程的执行(使用InputStream的read()方法从流中读取数据时,如果数据源中没有数据,它也会阻塞该线程),也就是前面介绍的输入流.输出流都是阻塞式的输入.输出.传统的输入流.输出流都是通过字节的移动来处理的,即使我们不直接去处理字节流,但底层的实现还

java 21 - 15 新IO流 NIO

1:JDK4  新IO要了解的类 Buffer(缓冲),Channer(通道) 2:JDK7  要了解的新IO类 Path:与平台无关的路径. Paths:包含了返回Path的静态方法. public static Path get(URI uri):根据给定的URI来确定文件路径. Files:操作文件的工具类.提供了大量的方法, 简单了解如下方法 public static long copy(Path source, OutputStream out) :复制文件 public stati