一、创建会话

1. 创建一个基本的ZooKeeper会话实例

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;/*** 创建一个基本的ZooKeeper会话实例* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);/*** ZooKeeper客户端和服务器会话的建立是一个异步的过程* 构造函数在处理完客户端的初始化工作后立即返回,在大多数情况下,并没有真正地建立好会话* 当会话真正创建完毕后,Zookeeper服务器会向客户端发送一个事件通知*/ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});System.out.println("State1: " + zk.getState());    // CONNECTING
        connectedSignal.await();        System.out.println("State2: " + zk.getState());    // CONNECTED
        zk.close();System.out.println("State3: " + zk.getState());    // CLOSED
    }}

2. 创建一个复用sessionId和sessionPasswd的Zookeeper对象示例

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;/*** 创建一个复用sessionId和sessionPasswd的ZooKeeper对象示例* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);        ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});connectedSignal.await();long sessionId = zk.getSessionId();byte[] passwd = zk.getSessionPasswd();zk.close();final CountDownLatch anotherConnectedSignal = new CountDownLatch(1);ZooKeeper newZk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {anotherConnectedSignal.countDown();}}},sessionId, passwd);anotherConnectedSignal.await();newZk.close();}}

二、创建节点

1. 使用同步API创建一个ZNode节点

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;/*** 使用同步API创建一个ZNode节点* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);       ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});connectedSignal.await();String path = zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println(path + " is created.");zk.close();}}

2. 使用异步API创建一个ZNode节点

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;/*** 使用异步API创建一个ZNode节点* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);       ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});connectedSignal.await();zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL,new AsyncCallback.StringCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, String name) {// 服务器响应吗System.out.println("ResultCode: " + rc);// 接口调用时传入API的数据节点的路径参数值System.out.println("Znode: " + path);// 接口调用时传入API的ctx参数值System.out.println("Context: " + (String)ctx);// 实际在服务端创建的节点名System.out.println("Real Path: " + name);}},"The Context");zk.close();}}

三、删除节点

1. 使用同API删除一个ZNode节点

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;/*** 使用同步API删除一个ZNode节点* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);       ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});connectedSignal.await();zk.delete("/zk-huey", -1);zk.close();}}

2. 使用异步API删除一个ZNode节点

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;/*** 使用异步API删除一个ZNode节点* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);       ZooKeeper zk = new ZooKeeper("192.168.1.109:2181", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {connectedSignal.countDown();}}});connectedSignal.await();zk.delete("/zk-huey", -1,new AsyncCallback.VoidCallback() {@Overridepublic void processResult(int rc, String path, Object ctx) {System.out.println("ResultCode: " + rc);System.out.println("Znode: " + path);System.out.println("Context: " + (String)ctx);}},"The Context");zk.close();}}

四、获取子节点列表

1. 使用同步API获取子节点列表

package com.huey.dream.demo;import java.util.List;
import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;/*** 使用同步API获取子节点列表* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, null);zk.register(new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();} else if (event.getType() == EventType.NodeChildrenChanged) {                    try {System.out.println("NodeChildrenChanged.");List<String> children = zk.getChildren(event.getPath(), true);System.out.println("Children: " + children);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}}});connectedSignal.await();zk.create("/zk-huey", "root".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.create("/zk-huey/node1", "node1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.create("/zk-huey/node2", "node2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);Stat stat = new Stat();List<String> children = zk.getChildren("/zk-huey", true,    // 注册默认的Watcher,当子节点类别发送变更的话,向客户端发送通知stat    // 用于描述节点状态信息
        );System.out.println("Stat: " + stat);System.out.println("Children: " + children);zk.create("/zk-huey/node3", "node3".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);Thread.sleep(10 * 1000);zk.close();}}

结果输出:

Stat: 4294967436,4294967436,1425201236879,1425201236879,0,2,0,0,4,2,4294967438Children: [node2, node1]
NodeChildrenChanged.
State: CONNECTED
Children: [node2, node3, node1]

2. 使用异步API获取子节点列表

package com.huey.dream.demo;import java.util.List;
import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;/*** 使用异步API获取子节点列表* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, null);zk.register(new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();} else if (event.getType() == EventType.NodeChildrenChanged) {                    try {System.out.println("NodeChildrenChanged.");List<String> children = zk.getChildren(event.getPath(), true);System.out.println("Children: " + children);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}}}});connectedSignal.await();zk.create("/zk-huey", "root".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.create("/zk-huey/node1", "node1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.create("/zk-huey/node2", "node2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.getChildren("/zk-huey", true,new AsyncCallback.Children2Callback() {@Overridepublic void processResult(int rc, String path, Object ctx,List<String> children, Stat stat) {System.out.println("ResultCode: " + rc);System.out.println("ZNode: " + path);System.out.println("Context: " + ctx);System.out.println("Children: " + children);System.out.println("Stat: " + stat);}},"The Context");zk.create("/zk-huey/node3", "node3".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);Thread.sleep(10 * 1000);zk.close();}}

五、获取节点数据内容

1. 使用同步API获取节点数据内容

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;/*** 使用同步API获取节点数据内容* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);byte[] nodeData = zk.getData("/zk-huey", false, null);System.out.println("NodeData: " + new String(nodeData));zk.close();}}

2. 使用异步API获取节点数据内容

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;/*** 使用异步API获取节点数据内容* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);zk.getData("/zk-huey", false, new AsyncCallback.DataCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, byte[] data,Stat stat) {System.out.println("ResultCode: " + rc);System.out.println("ZNode: " + path);System.out.println("Context: " + ctx);System.out.println("NodeData: " + new String(data));System.out.println("Stat: " + stat);}},"The Context");zk.close();}}

六、更新数据

1. 使用同步API更新节点数据内容

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;/*** 使用同步API更新节点数据内容* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);byte[] nodeData = zk.getData("/zk-huey", false, null);System.out.println("NodeData: " + nodeData);zk.setData("/zk-huey", "world".getBytes(), -1);nodeData = zk.getData("/zk-huey", false, null);System.out.println("NodeData: " + nodeData);zk.close();}}

2. 使用异步API更新节点数据内容

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;/*** 使用异步API更新节点数据内容* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);byte[] nodeData = zk.getData("/zk-huey", false, null);System.out.println("NodeData: " + nodeData);zk.setData("/zk-huey", "world".getBytes(), -1,new AsyncCallback.StatCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, Stat stat) {System.out.println("ResultCode: " + rc);System.out.println("ZNode: " + path);System.out.println("Context: " + ctx);System.out.println("Stat: " + stat);}},"The Context");zk.close();}}

七、判断节点是否存在

1. 使用同步API判断节点是否存在

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;/*** 使用同步API判断节点是否存在* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();Stat stat = zk.exists("/zk-huey", false);if (stat == null) {zk.create("/zk-huey", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);} else {System.out.println("Stat: " + stat);}zk.close();}}

2. 使用异步API判断节点是否存在

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;/*** 使用异步API判断节点是否存在* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {final CountDownLatch connectedSignal = new CountDownLatch(1);final ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {            @Overridepublic void process(WatchedEvent event) {if (event.getState() == KeeperState.SyncConnected) {if (event.getType() == EventType.None&& event.getPath() == null) {connectedSignal.countDown();}}}});connectedSignal.await();zk.exists("/zk-huey", false,new AsyncCallback.StatCallback() {@Overridepublic void processResult(int rc, String path, Object ctx, Stat stat) {System.out.println("ResultCode: " + rc);System.out.println("ZNode: " + path);System.out.println("Context: " + ctx);System.out.println("Stat: " + stat);}},"The Context");zk.close();}}

八、权限控制

package com.huey.dream.demo;import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;/*** ZooKeeper权限控制* @author  huey* @version 1.0 * @created 2015-3-1*/
public class ZKDemo {public static void main(String[] args) throws Exception {/*** 使用含有权限信息的zookeeper会话创建数据节点*/final CountDownLatch connectedSignal = new CountDownLatch(1);ZooKeeper zk = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {connectedSignal.countDown();}});connectedSignal.await();zk.addAuthInfo("digest", "huey:123".getBytes());zk.create("/zk-huey", "hello".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);zk.close();/*** 使用无权限信息的zookeeper会话访问含有权限信息的数据节点*/try {final CountDownLatch signal = new CountDownLatch(1);ZooKeeper zk1 = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {signal.countDown();}});signal.await();zk1.getData("/zk-huey", false, null);System.out.println("NodeData: " + new String(zk1.getData("/zk-huey", false, null)));zk1.close();} catch (Exception e) {System.out.println("Failed to delete Znode: " + e.getMessage());}/*** 使用错误权限信息的zookeeper会话访问含有权限信息的数据节点*/try {final CountDownLatch signal = new CountDownLatch(1);ZooKeeper zk2 = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {signal.countDown();}});signal.await();zk2.addAuthInfo("digest", "huey:abc".getBytes());System.out.println("NodeData: " + new String(zk2.getData("/zk-huey", false, null)));zk2.close();} catch (Exception e) {System.out.println("Failed to delete Znode: " + e.getMessage());}/*** 使用正确权限信息的zookeeper会话访问含有权限信息的数据节点*/try {final CountDownLatch signal = new CountDownLatch(1);ZooKeeper zk3 = new ZooKeeper("192.168.1.109:2182", 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {signal.countDown();}});signal.await();zk3.addAuthInfo("digest", "huey:123".getBytes());System.out.println("NodeData: " + new String(zk3.getData("/zk-huey", false, null)));zk3.close();} catch (Exception e) {System.out.println("Failed to delete Znode: " + e.getMessage());}}}

结果输出:

Failed to delete Znode: KeeperErrorCode = NoAuth for /zk-huey
Failed to delete Znode: KeeperErrorCode = NoAuth for /zk-huey
NodeData: hello

转载于:https://www.cnblogs.com/huey/p/4307056.html

ZooKeeper(3.4.5) - 原生 API 的简单示例相关推荐

  1. 原生API编写简单富文本编辑器001

    原生API编写简单富文本编辑器001 系列文章快速阅读: 富文本编辑器开发系列-1-基础概念 富文本编辑器开发系列2-document.execCommand 的API 富文本编辑器开发系列3-sel ...

  2. express 4.x API 及简单示例

    express 4.x API express() 创建一个express应用. The express() 函数是一个顶级函数通过express模块导出的. var express = requir ...

  3. 【Redis】三、Redis安装及简单示例

    (四)Redis安装及使用   Redis的安装比较简单,仍然和大多数的Apache开源软件一样,只需要下载,解压,配置环境变量即可.具体安装过程参考:菜鸟教程Redis安装.   安装完成后,通过r ...

  4. Zookeeper_原生API操作(二)

    在有curator这个框架之前的时候,然后zookeeper怎么去实现分布式锁,就是利用刚才的那种方案,就是可以去实现,你会有各种各样的疑问,你刚才讲的设计是得先get一下,你不如直接create,因 ...

  5. Zookeeper_原生API操作(一)

    讲了zookeeper的简单的介绍,以及环境搭建,还有zkClient的使用,基本上很简单,作为HelloWorld,今天继续往下走,既然已经把简介和环境搭建完了,然后一会来说说配置,配置也没有什么说 ...

  6. IOS7使用原生API进行二维码和条形码的扫描

    使用IOS7原生API进行二维码条形码的扫描 IOS7之前,开发者进行扫码编程时,一般会借助第三方库.常用的是ZBarSDK,IOS7之后,系统的AVMetadataObject类中,为我们提供了解析 ...

  7. api怎么写_使用Node.js原生API写一个web服务器

    Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...

  8. Java原生API操作XML

    使用Java操作XML的开源框架比较多,如著名的Dom4J.JDOM等,但个人认为不管你用那个框架都要对JDK原生的API有所了解才能更得心应手的应用.本篇就来简单了解下原生的XML API. JAV ...

  9. zookeeper集群搭建和API使用

    一.vmware设置虚拟机centeros的ip 1.设置vm属性 先设置NAT模式 点击菜单栏编辑 记录子网网关地址 2.修改linux配置 [1]修改linux ip地址 vi /etc/sysc ...

  10. H5调用Android原生Api

    Android 与H5交互之跳转拦截 Android拦截跳转,实现web调用原生Api 定义变量 在Android代码设置回调事件 前端代码 判断url是否合法 根据不同的type执行不同的操作 An ...

最新文章

  1. web service
  2. 音乐处理---H_music.php
  3. ESXi安装全过程及基本配置
  4. Chika and Friendly Pairs
  5. 【Python】忘记登录密码?遍历数字字母组合密码+模拟提交表单
  6. zoj 3640 概率dp
  7. 第73课 丑数 函数的应用
  8. [转帖] 国产x86-海光禅定 2018年营收过亿?
  9. PHP Socket 深度探索 (一)
  10. pip 卸载包失败的文件夹处理
  11. 自适应遗传算法(AGA)《Adaptive Probabilities of Crossover》的剖析
  12. 推荐3个计算机专业的英文电子书下载网站
  13. Flutter 微信语音消息播放动画
  14. DIM抠图网络 Deep Image Matting 论文笔记
  15. 数字孪生与3D可视化
  16. 有效的网络推广超级实用方法
  17. TIA博途下载PLC程序时提示“具有激活的TIS功能防止下载到设备”错误-处理办法
  18. 数理统计笔记7:分类数据分析-拟合优度检验和列联分析
  19. ### 通达信数据之实时机构持股数据接口
  20. qq协议 0825 和 0836 udp 登录包解析

热门文章

  1. 以太网交换机工作原理
  2. markdown快速创建表格及内容工具
  3. matlab平滑曲线_梯度下降法实现路径平滑
  4. [渝粤教育] 西南科技大学 农业技术经济学 在线考试复习资料
  5. 手把手教你强化学习 (四)动态规划与策略迭代、值迭代
  6. 智能控制-模糊控制Matlab函数汇总
  7. 优秀程序员必备技能大全
  8. Prism发布了第一个版本+Entlib3.1在VS2008下工作的解决方案
  9. 1042 cant get hostname for your address
  10. 【转】使用频率最高的美语口语296句