Magician 1.1.5 发布,支持 UDP,WebSocket

栏目: 软件资讯 · 发布时间: 3年前

内容简介:经过几个星期的苦战,终于迎来了第一个完整版,支持http,udp,websocket。 将一开始的规划都补齐了,后面将持续迭代。 本次的更新点如下 一、内部实现原理做了修改 一开始用的AIO来实现异步,后来因为回调太多,...

经过几个星期的苦战,终于迎来了第一个完整版,支持http,udp,websocket。 将一开始的规划都补齐了,后面将持续迭代。

本次的更新点如下

一、内部实现原理做了修改

一开始用的AIO来实现异步,后来因为回调太多,编程复杂度比较高,而且不好控制线程数量,所以给换掉了,换成了NIO。

NIO 比较流行的一个做法是使用Selector,它类似于一个队列,请求来了都会注册进去,然后由一个线程去遍历消费这些请求。 这就带来了一个问题,当请求数量多了以后,无法最大化的利用cpu的多核算力, 而且在消费的过程中如果遇到了 比较耗时的任务,将会堵死整个循环。

所以,我没有采用Selector,而是直接用的accept,在一个while里 调用accept,当有请求来了以后,accept会返回一个channel,这个channel会被丢到一个队列里。

可以看下面这张图

当服务启动的时候,会先初始化几个线程出来,具体初始几个可以自己配置,每个线程都会监控一个队列。

Magician 1.1.5 发布,支持 UDP,WebSocketMagician 1.1.5 发布,支持 UDP,WebSocketMagician 1.1.5 发布,支持 UDP,WebSocket

当队列里进来了任务,线程就会开始干活,依次消费自己管辖的这个队列里的任务。

整体模型大概是这样的

Magician 1.1.5 发布,支持 UDP,WebSocket

当客户端发起一个请求到服务端,服务端就会以轮询的方式给其中一个线程的队列添加一个任务,然后继续监控accept。

线程发现队列不为空,就会消费自己管辖的队列,去调用后面的业务逻辑。

这么做的好处

  1. 线程数量是可控的,不会出现请求多了以后 导致线程数过多 而对资源造成极大的压力
  2. 他是异步的,请求来了直接丢队列里即可,不用等在这消耗时间,而是直接去接收下一个请求。
  3. 请求分配给线程 是用的轮询算法,可以保证每个线程的压力均匀。

二、支持websocket了(现在还不是很成熟,连接如果很多,慎用)

创建handler

/**
 * WebSocket
 */
public class DemoSocketHandler implements WebSocketHandler {

    /**
     * 有连接进来时调用
     */
    @Override
    public void onOpen(WebSocketSession webSocketSession) {
        System.out.println("连接了websocket");
    }

    /**
     * 连接断开时调用
     */
    @Override
    public void onClose(WebSocketSession webSocketSession) {
        System.out.println("关闭了websocket");
    }

    /**
     * 有消息进来时调用
     */
    @Override
    public void onMessage(String message, WebSocketSession webSocketSession) {
        System.out.println("收到了消息"+message);
        try{
            webSocketSession.send("我收到了");
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

在创建http服务的时候,把handler添加进去

Magician.createHttpServer()
        .threadSize(5)
        .httpHandler("/", new DemoRequestHandler())
        // 注意这句
        .webSocketHandler("/websocket", new DemoSocketHandler())
        .bind(8080, 1000).start();

三、支持UDP了

创建handler

public class DemoUDPHandler implements MagicianUDPHandler {

    @Override
    public void receive(ByteArrayOutputStream byteArrayOutputStream) {
        
    }
}

创建UDP服务

Magician.createUdpServer()
        .bind(8088)
        .handler(new DemoUDPHandler())
        .start();

更多信息,可以访问官网

http://magician-io.com/


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

学习Web设计

学习Web设计

罗宾斯 / 靳志伟 / 机械工业出版社 / 2009-1 / 65.00元

《学习Web设计(第3版)》从说明网站和网页是如何工作开始,逐步深入。当你看完《学习Web设计(第3版)》时,你将掌握使用优化的图像文件来创建多列CSS布局的技术,而且你将知道如何创建网页。这一版经过了彻底的修订,它可以教你如何根据现代设计的实践经验和专业标准来创建网站。《学习Web设计(第3版)》包含了一些练习,可以帮助你学习各种技术,还有一些小测验可以确保你及时掌握重要的概念。如果你对网站设计......一起来看看 《学习Web设计》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具