Netty线程模型

Netty线程模型

在这里插入图片描述

传统io模型

  • 采用阻塞io获取数据

  • 每个链接都需要独立的线程去完成数据输入或处理,
    存在的问题

  • 并发数很大的话会占用很多线程资源并且线程切换也需要消耗很多

  • 连接成功后如果当前线程没有数据可读该线程会阻塞在read操作造成资源浪费

reactor模型

在这里插入图片描述

  1. 基于一个或多个客户端输入同时传递给服务器处理的模式
  2. 服务端处理多个请求并且将请求分发给线程池去处理,reactor模式也叫做dispatcher模式
  3. reactor模式基于io复用监听事件,收到事件后分发给线程;

三种实现模式

  1. 单Reactor单线程
  2. 单Reactor多线程
  3. 主从Reactor多线程 -》演变成netty

单Reactor单线程

在这里插入图片描述

package com.fr.server.groupchat;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;

public class GroupServer {
    private ServerSocketChannel listenchanel;
    private final  int port=6666;
    private Selector selector;
    public GroupServer() throws IOException {
        listenchanel=ServerSocketChannel.open();
        selector=Selector.open();
        listenchanel.configureBlocking(false);
        listenchanel.socket().bind(new InetSocketAddress(port));
        listenchanel.register(selector, SelectionKey.OP_ACCEPT);
    }

    public static void main(String[] args) throws IOException {
        GroupServer groupServer=new GroupServer();
        groupServer.listen();
    }
    public void listen() throws IOException {
        while (true){
            int select = selector.select();
            if (select>0){
                Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
                while (iterator.hasNext()){
                    SelectionKey next = iterator.next();
                    if (next.isAcceptable()){
                        SocketChannel accept = listenchanel.accept();
                        accept.configureBlocking(false);
                        accept.register(selector,SelectionKey.OP_READ);
                        System.out.println(accept.getRemoteAddress()+"上线了");
                    }
                    if(next.isReadable()){
                        readData(next);
                    }
                    iterator.remove();
                }

            }else {
                System.out.println("等待");
            }
        }

    }
    private void sendInfoToOtherClient(String msg,SocketChannel channel) throws IOException {
        System.out.println("转发消息");
        for (SelectionKey key:selector.keys()){
            Channel target = key.channel();
            if (target instanceof SocketChannel && target!=channel)
            {
                SocketChannel socketChannel=(SocketChannel)channel;
                ByteBuffer byteBuffer=ByteBuffer.wrap(msg.getBytes());
                socketChannel.write(byteBuffer);
            }
        }
    }
    private void readData(SelectionKey next) {
        SocketChannel channel = (SocketChannel) next.channel();

        try {
            ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
            int read=channel.read(byteBuffer);
            if (read>0) {
                String msg=new String(byteBuffer.array());
                sendInfoToOtherClient(msg,channel);
                System.out.println(msg+"客户端收到数据");
            }
        }catch (IOException e){
            try {
                System.out.println(channel.getRemoteAddress()+"离线了");
                next.cancel();
                channel.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }finally {

        }
    }
    
    
}

客户端就不写了,这个简单的Nioserver 就是reactor单线程模式。

在这里插入图片描述

存在问题
并发存在问题。

在这里插入图片描述

单reactor多线程

在这里插入图片描述
在这里插入图片描述

问题
在这里插入图片描述

主从reactor

在这里插入图片描述

在这里插入图片描述

NETTY 线程模型

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值