一个NIOServer的简单Demo

还是用maven管理的spring-mvc项目,废话不多说,直接上代码。
NIOServer.java

package com.socket.NIO;

import org.springframework.stereotype.Component;

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.util.Iterator;

/**
 * Created by wtz on 2017/9/16.
 */
@Component(value = "nioServer")
public class NIOServer {
    //通道管理器
    private Selector selector;

    /**
     * 获得一个ServerSocket通道,并对该通道做一些初始化的操作
     * @param port 绑定的端口号
     * @throws IOException
     */
    public void initServer(int port) throws IOException {
        //获得一个ServerSocket通道
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        //设置通道为非阻塞
        serverSocketChannel.configureBlocking(false);
        //将该通道对应的ServerSocket绑定到port端口
        serverSocketChannel.bind(new InetSocketAddress(port));
        //获得一个通道管理器
        this.selector = Selector.open();
        //将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_ACCEPT事件,注册该事件后
        //当该事件到达后,selector.select()会返回,如果该事件没到达selector.select()会一直阻塞
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
    }

    /**
     * 采用轮询的方式监听selector上是否有需要处理的事件,如果有的话,则进行处理
     * @throws IOException
     */
    public void listen() throws IOException {
        System.out.println("服务端启动成功!");
        //轮询访问selector
        while(true){
            //当注册的事件到达时,方法返回;否则,该方法会一直阻塞
            selector.select();
            //获得selector中选中的项的迭代器,选中的项为注册的事件
            Iterator<?> iterator = this.selector.selectedKeys().iterator();
            while(iterator.hasNext()){
                SelectionKey key = (SelectionKey) iterator.next();
                //删除已经选择的key,防止重复处理
                iterator.remove();
                handler(key);
            }
        }
    }

    /**
     * 处理请求
     * @param key
     */
    public void handler(SelectionKey key) throws IOException {
        //客户端请求连接事件
        if(key.isAcceptable()){
            handlerAccept(key);
        }
        //获得了可读事件
        else if(key.isReadable()){
            handlerRead(key);
        }
    }

    /**
     * 处理连接请求
     * @param key
     * @throws IOException
     */
    public void handlerAccept(SelectionKey key) throws IOException {
        ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
        //获得和客户端连接的通道
        SocketChannel channel = serverSocketChannel.accept();
        //设置成非阻塞
        channel.configureBlocking(false);
        //在这里可以给客户端发送信息
        System.out.println("新的客户端连接");
        //在和客户端连接成功之后,为了可以接收到客户端的信息,需要给通道设置读的权限
        channel.register(this.selector,SelectionKey.OP_READ);
    }

    /**
     * 处理读的事件
     * @param key
     * @throws IOException
     */
    public void handlerRead(SelectionKey key) throws IOException {
        //服务器可以读取消息:获取事件发生的socket通道
        SocketChannel channel = (SocketChannel) key.channel();
        //创建读取的缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        int read = channel.read(buffer);
        if(read > 0){
            byte[] data = buffer.array();
            String msg = new String(data).trim();
            System.out.println("服务端收到信息:" + msg);
            //回写数据
            ByteBuffer outBuffer = ByteBuffer.wrap("服务端收到了你的消息".getBytes());
            channel.write(outBuffer);
        }else {
            System.out.println("客户端关闭");
            key.cancel();
        }
    }
}

NIOServerTest.java

package com.socket.NIO;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.io.IOException;

/**
 * Created by wtz on 2017/9/16.
 */

// 加载spring配置文件
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-mybatis.xml","classpath:spring-mvc.xml"})
public class NIOServerTest {
    @Autowired
    private NIOServer nioServer;

    @Test
    public void testNIOStartServer() throws IOException {
        NIOServer server = new NIOServer();
        server.initServer(8000);
        server.listen();
    }

}

首先启动服务端
这里写图片描述

telnet连接NIO服务端
这里写图片描述

发送nihao给服务端,服务端进行回应
这里写图片描述

客户端关闭
这里写图片描述

以上就是一个简单的NIOServer的Demo

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTML是一种标记语言,用于创建网页的结构和内容。一个简单的HTML demo可以是一个静态网页,其中包含一个标题、一段文字和一张图片。 首先,我们需要一个HTML文件的骨架,也称为文档类型声明(DOCTYPE declaration),它告诉浏览器这是一个HTML5文档。下面是一个HTML文档的基本结构: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>HTML Demo</title> </head> <body> </body> </html> 首先,我们在<body>标签内添加一个<h1>标签,作为标题,内容可以是任何你想展示的文字。比如,我们写入"欢迎来到HTML Demo!"。 接下来,我们可以使用<p>标签来创建一段文字,在这里我们可以写入一些信息。比如,我们写入"这是一个简单的HTML demo,用于展示HTML的基本语法和功能。"。 最后,我们可以使用<img>标签来插入一张图片。要想展示图片需要提供图片的URL地址,这个地址可以是网络图片的url或者本地图片的路径。比如,我们插入一张名为"demo.jpg"的图片。 最终的HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>HTML Demo</title> </head> <body> <h1>欢迎来到HTML Demo!</h1> <p>这是一个简单的HTML demo,用于展示HTML的基本语法和功能。</p> <img src="demo.jpg" alt="演示图片"> </body> </html> 保存该HTML文件,并在浏览器中打开该文件,你将看到一个简单的网页,其中包含标题、一段文字和一张图片。这就是一个基本的HTML demo的例子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值