Magician 1.1.5 发布,支持 UDP,WebSocket

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

内容简介:经过几个星期的苦战,终于迎来了第一个完整版,支持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/


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

查看所有标签

猜你喜欢:

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

Python Web开发:测试驱动方法

Python Web开发:测试驱动方法

Harry J.W. Percival / 安道 / 人民邮电出版社 / 2015-10 / 99

本书从最基础的知识开始,讲解Web开发的整个流程,展示如何使用Python做测试驱动开发。本书由三个部分组成。第一部分介绍了测试驱动开发和Django的基础知识。第二部分讨论了Web开发要素,探讨了Web开发过程中不可避免的问题,及如何通过测试解决这些问题。第三部分探讨了一些高级话题,如模拟技术、集成第三方插件、Ajax、测试固件、持续集成等。本书适合Web开发人员阅读。一起来看看 《Python Web开发:测试驱动方法》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具