Magician 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
Magician 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
Magician 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
Magician 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
Magician 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !

软件简介

Magician 是一个异步非阻塞的网络协议解析包,支持Http, WebSocket, UDP等协议

运行环境

JDK11+

导入依赖

<dependency>
    <groupId>com.github.yuyenews</groupId>
    <artifactId>Magician</artifactId>
    <version>最新版</version>
</dependency>

<!-- 这个是日志包,支持任意可以跟slf4j桥接的包 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jdk14</artifactId>
    <version>1.7.12</version>
</dependency>

一、创建TCP服务(默认使用http解码器)

创建Handler

public class DemoHandler implements MagicianHandler<MagicianRequest> {

    @Override
    public void request(MagicianRequest magicianRequest) {
        // 响应数据
        magicianRequest.getResponse()
                .sendJson(200, "{'status':'ok'}");
    }
}

创建服务(默认线程池配置)

Magician.createTCPServer()
                    .handler("/", new DemoHandler())
                    .bind(8080);

创建服务(自定义线程池配置)

EventGroup ioEventGroup = new EventGroup(1, Executors.newCachedThreadPool());
EventGroup workerEventGroup = new EventGroup(10, Executors.newCachedThreadPool());

// 当前EventRunner没任务的时候,允许从其他EventRunner窃取任务
workerEventGroup.setSteal(EventEnum.STEAL.YES);

Magician.createTCPServer(ioEventGroup, workerEventGroup)
                    .handler("/", new DemoHandler())
                    .bind(8080);

创建服务(监听多端口)

// 监听几个端口,ioEventGroup的第一个参数就写几
EventGroup ioEventGroup = new EventGroup(2, Executors.newCachedThreadPool());
EventGroup workerEventGroup = new EventGroup(10, Executors.newCachedThreadPool());

// 当前EventRunner没任务的时候,允许从其他EventRunner窃取任务
workerEventGroup.setSteal(EventEnum.STEAL.YES);

TCPServer tcpServer = Magician
                         .createTCPServer(ioEventGroup, workerEventGroup)
                         .handler("/", new DemoHandler())

tcpServer.bind(8080);
tcpServer.bind(8088);

二、创建WebSocket

只需要在创建http服务的时候加一个handler即可

Magician.createTCPServer()
                    .handler("/", new DemoHandler())
                    .webSocketHandler("/websocket", new DemoSocketHandler())
                    .bind(8080);

三、创建UDP服务

Magician.createUdpServer()
                .handler(outputStream -> {
                    // outputStream 是ByteArrayOutputStream类型的
                    // 它是客户端发过来的数据,自行解析即可
                }).bind(8088);

除了这种写法,也可以单独创建handler,在这里add进去

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (0)

加载中
更多评论
发表了资讯
05/02 11:49

Magician 1.1.6 发布,采用事件组管理机制

Magician 1.1.6,作为第一个正式的版本,内部对NIO的实现部分做了大量优化与重构,采用了事件组管理机制,具体模型如下图所示: 采用了两个事件组来进行事件和线程池的管理,一个叫ioEventGroup,一个叫workerEventGroup,都是通过EventGroup类创建。 每个EventGroup 都对应一个EventRunner,每个EventRunner对应一个任务队列,可以管理多个事件。 当队列空了以后,可以去其他的EventRunner窃取任务,不会造成资源浪费。 ioEven...

1
13
发表了资讯
05/02 01:34

Magician 1.1.6 发布,异步非阻塞的网络协议解析包

Magician 1.1.6 已经发布,此版本更新内容包括: 彻底改写NIO实现部分,引入EventRunner机制 重新回归Selector,以事件来驱动,有效避免了 在报文不完整时 空转+阻塞的问题 详情查看:https://gitee.com/yuyenews/Magician/releases/1.1.6 项目简介 Magician 是一个异步非阻塞的网络协议解析包,支持Http, WebSocket, UDP等协议 运行环境 JDK11+ 导入依赖 <dependency> <groupId>com.github.yuyenews</groupId> <a...

0
3
发表了资讯
04/19 01:02

Magician 1.1.5 发布,支持 UDP,WebSocket

经过几个星期的苦战,终于迎来了第一个完整版,支持http,udp,websocket。 将一开始的规划都补齐了,后面将持续迭代。 本次的更新点如下 一、内部实现原理做了修改 一开始用的AIO来实现异步,后来因为回调太多,编程复杂度比较高,而且不好控制线程数量,所以给换掉了,换成了NIO。 NIO 比较流行的一个做法是使用Selector,它类似于一个队列,请求来了都会注册进去,然后由一个线程去遍历消费这些请求。 这就带来了一个问题,当...

0
5
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
2018/07/22 15:43

HDU 5316 Magician(线段树区间合并)

Magician Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 3745 Accepted Submission(s): 989 Problem Description Fantasy magicians usually gain their ability through one of three usual methods: possessing it as an innate talent, gaining it through study and practice, or receiving it from another being, often a god, spirit, or demon of some sor...

0
0
发表了博客
2019/08/15 13:34

越疆魔术师DEBOT(magician)机械臂ROS、MoveIt!和Gazebo功能包与ROS-I教程(melodic)

原文地址:https://blog.csdn.net/qq_42145185/article/details/93501741 喜欢DEBOT的小伙伴,现在可以仿真玩耍机械臂啦,如果已经购买可以配合一起玩耍起来。 支持 Ubuntu 16.04 + ROS Kinetic 或 Ubuntu 18.04 + ROS Melodic。 不论是经典版本ROS1K还是最新版本ROS1M都完美支持! 效果如下,更多功能还在继续开发中,下载地址参考本文第一行: roslaunch magician_description gazebo.launch Gazebo初始 roslaunch magician_m...

0
0
发表于软件架构专区
2017/11/07 22:40

继承与多态

# 继承与多态 ## 多态与is-a 在Java中。子类只能继承一个父类,子类与父类之间会有is-a(是一种)的关系。要理解多态要知道自己操作的是哪一种东西。 如下一种继承关系: ![image](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARsAAAExCAIAAADDeJEmAAAgAElEQVR4Ae1dz+slR/XNLyWJmyBEJIFsAtEEV6JuM4EkhPEvSLJxJYLiTlAUnKy/S5lZqRsR8hcEjEISsgnMwt2QkFVCFpExEEh0oRK/Zz7HObmpqtc/3qvXXdV9etFz695zb906VberX/d7n7nzv//97x0+zIA...

0
0
2020/11/24 10:29

【编测编学】零基础学python_09_列表(操作列表之遍历列表)

遍历整个列表 你经常需要遍历列表的所有元素,对每个元素执行相同的操作。例如,在游戏中,可能需要将每个界面元素平移相同的距离;对于包含数字的列表,可能需要对每个元素执行相同的统计运算;在网站中,可能需要显示文章列表中的每个标题。需要对列表中的每个元素都执行相同的操作时,可使用Python中的for 循环。 假设我们有一个魔术师名单,需要将其中每个魔术师的名字都打印出来。为此,我们可以分别获取名单中的每个名字,...

0
0
2019/08/22 14:16

Can you fool AI with magic tricks?

What can stage magic reveal about cognitive biases? Quite a lot, as it turns out. Researchers at the Institute of Neuroscience in Spain, Teatro Encantado in Madrid, and University Pompeu Fabra in Barcelona sought to apply AI and machine learning to quantify a professional magician’s skills in “naturalistic conditions.” They say that their trained system — which was designed to follow coins...

0
0
发表了博客
2019/06/05 15:45

8-10 了不起的魔术师

去最底部 8-10 了不起的魔术师:在为完成练习8-9而编写的程序中,编写一个名为make_great()的函数,对魔术师列表进行修改,在每个魔术师的名字中都加入字样"the Great".调用函数show_magicians(),确认魔术师列表确定变了. # 8-9 magicians = ["老王","猫猫","登登"] def show_magicians(magicians):   for magician in magicians:     print(magician) show_magicians(magicians) # 8-10 def show_magicians(magicians,new_m...

0
0
2020/06/11 20:48

Python基础编程—操作列表篇(一)

遍历整个列表 你经常需要遍历列表的所有元素,对每个元素执行相同的操作。 在游戏中,可能需要将每个界面元素平移相同的距离;对于包含数字的列表,可能需要对每个元素执行相同的统计运算; 在网站中,可能需要显示文章列表中的每个标题。需要对列表中的每个元素都执行相同的操作时,可使用Python中的for循环。 假设我有一个魔术师名单,需要将其中每个魔术师的名字的打印出来。为此,我们可以分别获取名单中的每个名字,但这种...

0
0
发表了博客
2018/07/22 17:29

面向对象的继承和多态(is-a)

继承的主要作用:我们使用继承主要是为了避免出现重复的定义,程序中如果出现多个地方有相同的定义,可以把相同程序提取出来定义为父类。 子类继承父类使用extends关键字,子类具备父类所有的属性和方法,包括私有方法,只不过子类对父类的私有方法和成员没有访问权限,除非父类对外提供了访问的接口(get、set)方法。 子类可以自己扩充行为,也可以对父类的方法进行重写。 ------------------------------------------------...

0
0
2015/01/11 23:05

Spring6---为通知传递参数

package com.springinaction.springidol; public interface MindReader { void interceptThoughts(String thoughts); String getThoughts(); } package com.springinaction.springidol; public class Magician implements MindReader { private String thoughts; public void interceptThoughts(String thoughts) { System.out.println("Intercepting volunteer's thoughts---" + thoughts); this.thoughts = thoughts; } publi...

0
0
发表了博客
2019/07/16 17:59

[2018CCPC吉林赛区(重现赛)- 感谢北华大学] 补题记录 躁起来

1007 High Priestess 埃及分数 1008 Lovers 线段树维护取膜意义下的区间s和。 每个区间保存前缀lazy和后缀lazy。 #include <iostream> using namespace std; #define pb push_back #define fi first #define se second #define debug(x) cerr<<#x << " := " << x << endl; #define bug cerr<<"-----------------------"<<endl; #define FOR(a, b, c) for(int a = b; a <= c; ++ a) typedef long long ll; typedef l...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
11 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部