node

nodejs 完成mqtt服务端

老子叫甜甜 提交于 2020-02-29 04:35:48
今天使用mosca 写了一下基于MQTT的消息服务端,用于下一个项目的知识储备; 该功能主要是基本 NODEJS 的 mosca 插件完成 1. 安装 mosca npm install mosca --save 2. 创建mqtt服务端,端口为:8000 var mosca = require('mosca'); var MqttServer = new mosca.Server({ port: 8000 }); 3. mqtt服务端部分逻辑处理 MqttServer.on('clientConnected', function(client){ console.log('client connected', client.id); }); /** * 监听MQTT主题消息 **/ MqttServer.on('published', function(packet, client) { var topic = packet.topic; switch(topic){ case 'pubMsg': console.log('message-publish', packet.payload.toString()); //MQTT转发主题消息 MqttServer.publish({topic: 'other', payload: 'sssss'}); //发送消息NODEJS

数据结构与算法分析:(五)循环链表

自闭症网瘾萝莉.ら 提交于 2020-02-29 02:05:50
一、前言 相信小伙伴们在前面两篇文章的详细介绍已经对单向链表、双向链表有一个很清晰的认识了。 数据结构与算法分析:(三)单向链表 数据结构与算法分析:(四)双向链表 接下来我们来介绍循环链表,你把单向链表、双向链表搞清楚了的话,循环链表自然也不难了。 循环链表可分为:单向循环链表、双向循环链表。 1、单向循环链表: 单向循环链表跟单向链表唯一的区别就在 尾结点 。我们知道,单向链表的尾结点指针指向空地址,表示这就是最后的结点了。而单向循环链表的尾结点指针是指向链表的头结点。从我画的单向循环链表图中,你应该可以看出来,它像一个环一样首尾相连,所以叫作“单向循环”链表。 和单向链表相比,单向循环链表的优点是从链尾到链头比较方便。当要处理的数据具有环型结构特点时,就特别适合采用单向循环链表。比如著名的 约瑟夫问题 。尽管用单向链表也可以实现,但是用单向循环链表实现的话,代码就会简洁很多。 2、双向循环链表: 双向循环链表想必也不用我多说了吧。 二、循环链表实战 假设有这么一个小游戏: 100个人围成圆圈,从1开始报数,喊到3人的时候退出,重复,直到剩下最后一个人。 看到围成圆圈,立马想到了 循环链表 这个数据结构。 1、我们先来定义循环链表的接口 public interface CircularLinkedList < E > { /** * 向链表插入一个元素,默认在尾部 *

AbstractQueuedSynchronizer的学习

不问归期 提交于 2020-02-28 22:32:02
AbstractQueuedSynchronizer public class AQSDemo implements Lock { private Sycn sycn = new Sycn ( ) ; //实现同步器 private class Sycn extends AbstractQueuedSynchronizer { @Override protected boolean tryAcquire ( int arg ) { //尝试获取锁的方法 //如果第一个线程进来,可以拿到锁,因此我们可以返回true //如果第二个线程进来,拿不到锁,返回false //如何判断是第一个线程进来还是其他线程进来? //getState()方法返回 1 表示 锁被线程持有 0表示锁没被线程持有 int state = getState ( ) ; if ( state == 0 ) { if ( compareAndSetState ( 0 , arg ) ) { //更新状态 setExclusiveOwnerThread ( Thread . currentThread ( ) ) ; //设置为当前线程 return true ; //获取到锁 } } return false ; //没有获取到锁 } @Override protected boolean tryRelease

Java 双向链表的增删改查

放肆的年华 提交于 2020-02-28 18:57:53
双向链表 简介 双向链表是基于单链表的基础上,每个节点中添加了一个指向上一个节点的指针。相对单链表而言,双向链表中的增删除改更为方便。例如,双链表可以便捷地进行自我删除的(单链表则需要借助辅助节点),届时只需要需要删除节点的相邻节点进行链接,便可实现自我删除。 功能实现 定义双链表节点 在单链表的基础上,添加一个存储上一个节点的指针。 class Node { int no; String name; Node next; Node pre; /** * 构造函数 */ public Node(int no, String data) { this.no = no; this.name = data; } } 遍历 双链表的遍历也是和单链表一样的。只需要从头结点开始,逐个遍历便可。判断题条件是当前节点的下一个节点不为空(temp.next != null)。 完整代码: public void printAll() { if (headNode.next == null) { System.out.println("链表为空~!"); return; } Node temp = headNode; while (null != temp.next) { temp = temp.next; System.out.println("编号: " + temp.no + " \t姓名:"

node ncc 打包

柔情痞子 提交于 2020-02-28 17:04:05
https://github.com/zeit/ncc#readme gcc的node版, 由webpack和rullup两位作者开发 用于js和ts的打包, 零配置, 不过还是需要tsonfig.json 简单版 { "compilerOptions": { "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ "outDir": "./lib", /* Redirect output structure to the directory. */ "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */

hashMap与concurrentHashMap

杀马特。学长 韩版系。学妹 提交于 2020-02-28 12:22:30
一 功能简介 hashMap与concurrentHashMap 都属于集合,用于存储键值对数据,它两最明显的区别是,hashMap是非线程安全的,concurrentHashMap是线程安全的, concunrrentHashMap还有另外的称呼,如 并发容器 概述 HashMap jdk 1.7 实现方式:底层 数组+链表 jdk 1.8 实现方式:底层 数组+链表+红黑树 初始大小:16 负载因子:0.75 扩容:newSize = oldSize*2; map中元素总数超过Entry数组的75%,触发扩容操作 存放键值对要求:key 和 value 都允许为null,这种key只能有1个 线程安全性:不安全 父类:AbstractMap ConcurrentHashMap jdk 1.7 实现方式:底层 segment数组 + hashEntry数组+链表 segment 数组初始化:在申明 ConcurrentHashMap对象的时候 jdk 1.8 实现方式:底层 node数组+链表+红黑树 node数组初始化:put()第一个元素的时候 默认初始大小 16 负载因子:0.75 线程安全 父类 AbstractMap 二 实现逻辑 2.1 hashMap的内部实现逻辑 JDK1.7 hashmap 里面是一个数组,数组中每个元素是一个Entry类型的实例

ECMAScript 6简介

别说谁变了你拦得住时间么 提交于 2020-02-28 11:48:16
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 标准的制定者有计划,以后每年发布一次标准,使用年份作为标准的版本。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。也就是说,ES6就是ES2015,下一年应该会发布小幅修订的ES2016。 ECMAScript和JavaScript的关系 一个常见的问题是,ECMAScript和JavaScript到底是什么关系? 要讲清楚这个问题,需要回顾历史。1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript,这个版本就是1.0版。 该标准从一开始就是针对JavaScript语言制定的,但是之所以不叫JavaScript,有两个原因。一是商标,Java是Sun公司的商标,根据授权协议,只有Netscape公司可以合法地使用JavaScript这个名字,且JavaScript本身也已经被Netscape公司注册为商标

多线程进阶——JUC并发编程之CountDownLatch源码一探究竟

ぃ、小莉子 提交于 2020-02-28 11:17:32
1、学习切入点 JDK的并发包中提供了几个非常有用的并发工具类。 CountDownLatch 、 CyclicBarrier 和 Semaphore 工具类提供了一种并发流程控制的手段。本文将介绍CountDownLatch(闭锁)的实现原理。在了解闭锁之前需要先了解AQS,因为CountDownLatch的实现需要依赖于AQS共享锁的实现机制。 官方文档: https://docs.oracle.com/javase/8/docs/api/ 百度翻译如下: 一种同步辅助程序,允许一个或多个线程等待在其它线程中执行的一组操作完成。使用给定的计数初始化CountDownLatch。由于调用了countDown()方法,await方法阻塞直到当前计数为零,之后释放所有等待线程,并立即返回await的任何后续调用。这是一个一次性现象——计数不能重置。如果需要重置计数的版本,请考虑使用CyclicBarrier。倒计时锁存器是一种通用的同步工具,可用于多种目的。使用计数1初始化的倒计时锁存器用作简单的开/关锁存器或门:调用倒计时()的线程打开它之前,调用它的所有线程都在门处等待。初始化为N的倒计时锁存器可用于使一个线程等待N个线程完成某个操作或某个操作已完成N次。倒计时锁存器的一个有用特性是,它不要求调用倒计时的线程在继续之前等待计数达到零