`

nio 服务器/客户端模式

阅读更多
package nio.asyn;

import java.io.IOException;
import java.net.InetSocketAddress;
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.nio.channels.spi.SelectorProvider;
import java.util.Iterator;

public class OperationServer implements Runnable {

    private int                 port1            = 8090;
    private int                 port2            = 9090;
    private Selector            selector;
    /**
    * Selector对象,负责监控所有的连接到服务器的网络事件的发生
    */
    private ServerSocketChannel serverChannel1;
    private ByteBuffer          readBuffer       = ByteBuffer.allocate(8192);
    private ServerSocketChannel serverChannel2;
    private SocketChannel       socketChannel1;
    private SocketChannel       socketChannel2;
    private AddProcessor    client1Processor = new AddProcessor();
    private MultiProcessor    client2Processor = new MultiProcessor();

    public OperationServer(){
        initSelector();
    }

    @Override
    public void run() {
        while (true) {
            try {
                this.selector.select();
                Iterator selectedKeys = this.selector.selectedKeys().iterator();
                while (selectedKeys.hasNext()) {
                    SelectionKey key = (SelectionKey) selectedKeys.next();
                    selectedKeys.remove();

                    if (!key.isValid()) {
                        continue;
                    }

                    if (key.isAcceptable()) {
                        this.accept(key);
                    } else if (key.isReadable()) {
                        this.read(key);
                    } else if (key.isWritable()) {
                        this.write(key);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public void accept(SelectionKey key) throws IOException {
        ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
        if (serverSocketChannel.equals(serverChannel1)) {
            socketChannel1 = serverSocketChannel.accept();
            socketChannel1.configureBlocking(false); //将客户端Channel设置为非阻塞型
            socketChannel1.register(this.selector, SelectionKey.OP_READ);
            /**
            * 将客户端Channel注册到Selector对象上,并且指出客户端Channel所感
            * 兴趣的事件为可读和可写
            */
            
        } else {
            socketChannel2 = serverSocketChannel.accept();
            socketChannel2.configureBlocking(false);
            socketChannel2.register(this.selector, SelectionKey.OP_READ);
        }

    }

    public void read(SelectionKey key) throws IOException {
        SocketChannel socketChannel = (SocketChannel) key.channel();

        this.readBuffer.clear();

        // Attempt to read off the channel
        int numRead;
        try {
            numRead = socketChannel.read(this.readBuffer);
        } catch (IOException e) {
            // The remote forcibly closed the connection, cancel
            // the selection key and close the channel.
            key.cancel();
            socketChannel.close();
            return;
        }

        if (numRead == -1) {
            // Remote entity shut the socket down cleanly. Do the
            // same from our end and cancel the channel.
            key.channel().close();
            key.cancel();
            return;
        }
        String input = new String(readBuffer.array()).trim();
        if (socketChannel.equals(socketChannel1)) {
            client1Processor.process(input);
        } else {
            client2Processor.process(input);
        }
    }

    public void write(SelectionKey key) {

    }

    /**
     * 注册事件到selector;
     */
    public void initSelector() {
        try {
            selector = SelectorProvider.provider().openSelector();  //初始化Selector对象
            this.serverChannel1 = ServerSocketChannel.open();  //初始化服务器Channel对象
            serverChannel1.configureBlocking(false); 
            InetSocketAddress isa = new InetSocketAddress("localhost", this.port1);
            serverChannel1.socket().bind(isa);//获取服务器Channel对应的//ServerSocket对象
            serverChannel1.register(selector, SelectionKey.OP_ACCEPT);  //将服务器Channel注册到Selector对象,并指出服务器Channel所感兴趣的事件为可接受请求操作
            this.serverChannel2 = ServerSocketChannel.open();
            serverChannel2.configureBlocking(false);
            InetSocketAddress isa2 = new InetSocketAddress("localhost", this.port2);
            serverChannel2.socket().bind(isa2);
            serverChannel2.register(selector, SelectionKey.OP_ACCEPT);//client.register(selector,SelectionKey.OP_READ|SelectionKey.OP_READ);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        OperationServer server = new OperationServer();
        Thread t = new Thread(server);
        t.start();
    }

}
  • src.zip (35.9 KB)
  • 下载次数: 6
分享到:
评论

相关推荐

    cs模式聊天服务器和客户端

    CS模式,即Client-Server(客户端-服务器)模式,是一种常见的网络通信架构,广泛应用于各种互联网服务,包括聊天应用。在这个架构中,客户端是用户交互的界面,而服务器端则负责处理请求、存储数据和提供服务。在这...

    java nio服务器

    在Java NIO服务器开发中,它允许服务器处理多个客户端连接,而无需为每个连接创建单独的线程,从而避免了线程创建和销毁的开销,提升了系统的资源利用率。 标题中的“java nio服务器”指的是使用Java NIO API构建的...

    Neety服务器与客户端简单案例

    注意,Netty通常使用NIO(非阻塞I/O)模式,这使得它在高并发场景下表现优秀。 在深入研究案例之前,确保你对Java NIO有一定的了解,因为Netty的基础就是NIO。此外,理解ByteBuf(Netty中的缓冲区类)的使用也很...

    Java NIO非阻塞服务端与客户端相互通信

    - **NIO在高并发服务器中的应用**:例如Tomcat服务器、Netty框架等都利用了Java NIO的特性来提高性能。 - **NIO与TCP/IP套接字**:NIO可以方便地与TCP/IP套接字结合,实现高效的网络通信。 总之,Java NIO非阻塞...

    一站式学习Java网络编程 全面理解BIO:NIO:AIO1

    NIO(Non-Blocking I/O)是一种异步非阻塞式 I/O 模式,服务器使用单个线程来处理多个客户端请求,提高了服务器的性能和可扩展性。 AIO(Asynchronous I/O)是一种异步非阻塞式 I/O 模式,服务器使用回调函数来处理...

    Java NIO服务器端开发详解

    NIO 模式可以使服务器端处理大量的客户端连接,提高服务器端的并发能力和可扩展性。 五、Java NIO 服务器端开发的实现细节 Java NIO 服务器端开发的实现细节包括缓冲区的操作、通道的操作、选择器的操作等。缓冲区...

    java多线程nio服务器

    Java NIO服务器设计通常涉及到以下几个核心概念: 1. **通道(Channels)**:通道是数据传输的途径,类似于传统的输入/输出流。Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,...

    从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式

    Jetty、Tomcat和Mina都是Java领域中著名的Web服务器和应用服务器,它们在NIO架构上有着相似的设计模式。本文将从这三个框架中提炼出NIO构架网络服务器的经典模式,并逐一解析它们的核心机制。 首先,Jetty的NIO实现...

    多线程NIO客户端实例

    ### 多线程NIO客户端实例解析 #### 核心概念与原理 在深入解析这段代码之前,我们先来理解一下几个核心的概念:**多线程**、**NIO(Non-blocking I/O)**以及它们如何协同工作在客户端编程中。 - **多线程**:在...

    socket通信NIO代理模式demo实例

    在NIO代理模式中,代理服务器作为客户端与目标服务器之间的中介,接收客户端的请求,然后转发给目标服务器,并将目标服务器的响应返回给客户端。这种方式可以用于隐藏真实服务器的地址,或者增加额外的安全层,同时...

    基于Java NIO反应器模式设计与实现

    综上所述,基于Java NIO的反应器模式设计与实现,可以大幅提升网络服务器的性能,通过非阻塞IO、事件驱动、选择器等机制,高效地处理高并发的数据传输任务,并且优化了线程资源的使用,减少了线程上下文切换的时间...

    mqtt-nio:Swift NIO MQTT 3.1.1客户端

    它使用pub / sub模式,并在设备,服务器和应用程序之间转换消息。 它通常用于物联网(IoT)技术。 用法 创建一个客户端并连接到MQTT代理。 let client = MQTTClient ( host : " mqtt.eclipse.org " , port : ...

    java BIO NIO AIO

    Java NIO(Non-Blocking I/O)是一种同步非阻塞式的 I/O 模式,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求就进行处理。NIO ...

    使用Java_NIO编写高性能的服务器.doc

    ### 使用Java NIO编写高性能服务器的关键知识点 #### 一、NIO概述 - **NIO简介**:NIO(New IO)自JDK 1.4引入以来,为Java提供了非阻塞IO的支持,这对于提高服务端应用的性能至关重要。NIO的核心特性包括缓冲区...

    采用NIO实现一个Socket服务器

    至此,我们已经创建了一个简单的NIO Socket服务器,能够接受客户端连接并进行数据传输。实际应用中,还需要考虑异常处理、多线程处理客户端、关闭资源等细节。通过阅读提供的“NIO_Sample”压缩包中的代码示例,可以...

    p2p网络聊天室-----c/s模式

    相反,C/S模式则是传统的客户端-服务器架构,其中一部分设备作为服务器提供服务,而另一部分设备作为客户端请求服务。在C/S模式的聊天室中,所有用户都连接到同一台或一组服务器,由服务器处理并转发消息。这种方式...

    NIO简易服务器框架、文件传输

    3. **过滤器链(Filter Chain)**:服务器端的过滤器链是一种设计模式,用于在数据处理过程中添加多个处理阶段。在这个例子中,有两个过滤器已经实现: - **日志过滤器(Logger Filter)**:此过滤器负责记录客户端...

    ScalableIOJava(NIO如何实现Selector模式的).pdf

    Reactor模式允许单个线程高效地处理多个客户端的I/O事件。在Reactor模式中,通常有一个或多个事件处理器负责监听事件,然后将这些事件分发给相应的处理器进行处理。Reactor模式可以有不同的实现版本,包括基础模式、...

    Java 客户端服务器程序 学习笔记

    在Java编程领域,客户端-服务器(Client-Server)程序是一种常见的架构模式,它涉及两个主要组件:客户端应用程序和服务器端应用程序。在这个“Java客户端服务器程序学习笔记”中,我们将深入探讨这一主题,包括如何...

Global site tag (gtag.js) - Google Analytics