1 群机器人

    (1) 引言

    钉钉聊天群内支持的群机器人, 类似QQ 群机器人, 可以发天气, 讲笑话那样;

    钉钉群机器人支持自定义机器人, 允许开发者管理机器人做预警消息通知;

    注意: 我没重置access_token, demo支持消息发送, 但会发送到我这个群, 建议你们使用自己的webhook

    (2) 限制

  • 6 个机器人/每群, 20条消息/每分钟
  • 不支持应答模式, 仅做群消息通知

    (3) 消息格式

    支持普通文本消息, 链接消息, markdown 格式(注意仅部分语法支持)文本, 图片及链接, 支持FeedCard, ActionCard 等消息

    (4) 官方开发文档

    https://open-doc.dingtalk.com/microapp/serverapi3/iydd5h

2 自定义机器人

2.1 创建机器人

    自定义机器人依赖于钉钉群, 首先创建钉钉群(群主有权限查看access_token), 拿到webhook 信息, 通过网络发送请求, 钉钉开放平台响应请求发送预警消息到指定access_token 的钉钉群

    钉钉群创建方式是在聊天页面, 点击"+"添加其他人来创建一个钉钉群.

图2-1. 钉钉群创建图

    进入群, 打开设置, 选中群机器人, 创建自定义机器人, 完善机器人基本信息后创建完成, 机器人自动推送一条欢迎语到钉钉群.

图2-2. 添加自定义机器人图

图2-3. 创建自定义机器人图

图2-4. 群机器人欢迎语图
    查看群机器人, 可以看到当前钉钉群已有的机器人列表, 可以管理添加机器人, 移除机器人, 编辑已有机器人名称,头像; 其中群机器人支持关闭开启消息推送和指定webhook 重置功能. webhook 可以理解为access_token 是身份标识, 此身份标识了指定群, 也标识了拥有群机器人消息推送的权限.

图2-5. 群机器人管理页面图

2.2 Postman 通过webhook 发送消息演示

    此处使用Postman 模拟请求, 如下所示, 发送普通文本消息后, 钉钉群会收到机器人的预警消息.

图2-6. Postman 通过webhook 发送普通文本消息图

图2-7. 群机器人发送消息成功图

3 创建项目引入钉钉机器人SDK

    本机开发环境win10, 已创建钉钉群, 并获取到webhook, 本机使用的IDEA, 下载的Java SDK

3.1 创建Maven 项目引入SDK

    (1)Java SDK 下载

    下载SDK: https://open-doc.dingtalk.com/microapp/faquestions/vzbp02, 官方支持以下版本, 此处使用Java SDK;

  • JAVA版本
  • PHP版本
  • .NET版
  • Python版

        解压后是官方直接打好的jar 包, 也包括源码包

    (2)创建Maven 项目引入Jar

    创建Maven 项目引入打好的jar 包: 本机jar 包地址: D:\download\dingtalk-sdk-java\taobao-sdk-java-auto_1479188381469-20190704.jar

  • mvn 命令

mvn install:install-file

-Dfile=D:\download\dingtalk-sdk-java\taobao-sdk-java-auto_1479188381469-20190704.jar -DgroupId=com.dingtalk -DartifactId=com-dingtalk-api

-Dversion=1.0.0 -Dpackaging=jar

  • 参数说明

-Dfile jar包所在路径,需要包含jar包名.此处D:\download\dingtalk-sdk-java\taobao-sdk-java-auto_1479188381469-20190704.jar

-DgroupId 指定导入jar时的groupid,可以自定义,此处com.dingtalk

-DartifactId指定导入jar时的artifactId,可以自定义,此处com-dingtalk-api

-Dversion 指定导入jar时的版本号,可以自定义,此处1.0.0

-Dpackaging 指定文件类型 ,由于这里是jar包的形式,所以这里得是jar

图3-1. 项目引入SDK 图
    (3)配置依赖, 如果项目没有自动引入依赖,可以点击reimport 重新加载依赖

图3-2. 重新加载依赖图

3.2 预警消息发送工具类封装
3.2.1 工具类说明

    项目成功引入SDK, 支持通过SDK 指定自定义机器人去发送群消息, 前面有说明群机器人支持发送多种类型的消息, 也支持消息带跳转链接, 或者图片带跳转链接等;

    工具类创建客户端client 实例需要拥有正确的webhook, 就是图2-5. 群机器人管理页面图中群设置中可以查看或者重置的hook 标识.

  1. /**
  2. * 钉钉群设置 webhook, 支持重置
  3. */
  4. private static final String ACCESS_TOKEN = "https://oapi.dingtalk.com/robot/send?access_token=36ba0cc82d41d3c6aaef7d2c09c9f14de0727069edbc498b5c9d88edb72db227";
  5. /**
  6. * 消息类型
  7. */
  8. private static final String MSG_TYPE_TEXT = "text";
  9. private static final String MSG_TYPE_LINK = "link";
  10. private static final String MSG_TYPE_MARKDOWN = "markdown";
  11. private static final String MSG_TYPE_ACTION_CARD = "actionCard";
  12. private static final String MSG_TYPE_FEED_CARD = "feedCard";
  13. /**
  14. * 客户端实例
  15. */
  16. public static DingTalkClient client = new DefaultDingTalkClient(ACCESS_TOKEN);

    util 下即封装的工具类RobotHelperUtil.java, 其中test 包下有做单元测试

图3-3. 项目结构图

3.3.2 测试发送消息

    此处单元测试测试方法sendMessageByMarkdown(), sendMessageByActionCardMulti(), sendMessageByFeedCard() 等方法, 群机器人会发送群消息, 其中方法参数title 效果如图中左侧(联系人列表页面)透出的消息内容, text 是进入群后的真正的消息.;

图3-4. 单元测试消息发送方法图

图3-5. sendMessageByMarkdown 消息发送成功图

    此处发送的支持单独跳转的消息, 初始化了三个按钮附带跳转链接, 按钮默认纵向排列. 点击按钮即可跳转指定链接查看详细内容.

图3-6. sendMessageByActionCardMulti 消息发送成功图

    此处发送的支持多个Link 的消息, 初始化了三个link , 指定标题导图及跳转链接; 首个link 效果更突出, 这个还挺好玩的.

图3-7. sendMessageByFeedCard 消息发送成功图

3.3 项目源码
  • 工具类代码:
  1. package pers.niaonao.dingtalkrobot.util;
  2. import com.dingtalk.api.DefaultDingTalkClient;
  3. import com.dingtalk.api.DingTalkClient;
  4. import com.dingtalk.api.request.OapiRobotSendRequest ;
  5. import com.dingtalk.api.response.OapiRobotSendResponse;
  6. import com.taobao.api.ApiException;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.springframework.util.CollectionUtils;
  9. import org.springframework.util.StringUtils;
  10. import java.util.Arrays;
  11. import java.util.List;
  12. /**
  13. * @className: RobotHelperUtil
  14. * @description: 机器人工具类
  15. * 每个机器人每分钟最多发送20条
  16. * 限制6 个机器人/群
  17. * @author: niaonao
  18. * @date: 2019/7/6
  19. **/
  20. @Slf4j
  21. public class RobotHelperUtil {
  22. /**
  23. * 钉钉群设置 webhook, 支持重置
  24. */
  25. private static final String ACCESS_TOKEN = "https://oapi.dingtalk.com/robot/send?access_token=36ba0cc82d41d3c6aaef7d2c09c9f14de0727069edbc498b5c9d88edb72db227";
  26. /**
  27. * 消息类型
  28. */
  29. private static final String MSG_TYPE_TEXT = "text";
  30. private static final String MSG_TYPE_LINK = "link";
  31. private static final String MSG_TYPE_MARKDOWN = "markdown";
  32. private static final String MSG_TYPE_ACTION_CARD = "actionCard";
  33. private static final String MSG_TYPE_FEED_CARD = "feedCard";
  34. /**
  35. * 客户端实例
  36. */
  37. public static DingTalkClient client = new DefaultDingTalkClient(ACCESS_TOKEN);
  38. /**
  39. * @description: 官方演示示例
  40. * title 是消息列表下透出的标题
  41. * text 是进入群后看到的消息内容
  42. *
  43. * @author: niaonao
  44. * @date: 2019/7/6
  45. */
  46. public static void sdkDemoJava() {
  47. DingTalkClient client = RobotHelperUtil.client;
  48. OapiRobotSendRequest request = new OapiRobotSendRequest();
  49. request.setMsgtype("text");
  50. OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
  51. text.setContent("测试文本消息");
  52. request.setText(text);
  53. OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
  54. at.setAtMobiles(Arrays.asList("13261303345"));
  55. request.setAt(at);
  56. request.setMsgtype("link");
  57. OapiRobotSendRequest.Link link = new OapiRobotSendRequest.Link();
  58. link.setMessageUrl("https://www.dingtalk.com/");
  59. link.setPicUrl("");
  60. link.setTitle("时代的火车向前开");
  61. link.setText("这个即将发布的新版本,创始人陈航(花名“无招”)称它为“红树林”。\n" +
  62. "而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,这一次,为什么是“红树林");
  63. request.setLink(link);
  64. request.setMsgtype("markdown");
  65. OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
  66. markdown.setTitle("杭州天气");
  67. markdown.setText("#### 杭州天气 @156xxxx8827\n" +
  68. "> 9度,西北风1级,空气良89,相对温度73%\n\n" +
  69. "> ![screenshot](https://gw.alipayobjects.com/zos/skylark-tools/public/files/84111bbeba74743d2771ed4f062d1f25.png)\n" +
  70. "> ###### 10点20分发布 [天气](http://www.thinkpage.cn/) \n");
  71. request.setMarkdown(markdown);
  72. try {
  73. client.execute(request);
  74. } catch (ApiException e) {
  75. log.error("[ApiException]: 消息发送演示示例, 异常捕获{}", e.getMessage());
  76. }
  77. }
  78. /**
  79. * @description: 发送普通文本消息
  80. * @param content 文本消息
  81. * @param mobileList 指定@ 联系人
  82. * @param isAtAll 是否@ 全部联系人
  83. * @return: com.dingtalk.api.response.OapiRobotSendResponse
  84. * @author: niaonao
  85. * @date: 2019/7/6
  86. */
  87. public static OapiRobotSendResponse sendMessageByText(String content, List<String> mobileList, boolean isAtAll) {
  88. if (StringUtils.isEmpty(content)) {
  89. return null;
  90. }
  91. //参数 参数类型 必须 说明
  92. //msgtype String 是 消息类型,此时固定为:text
  93. //content String 是 消息内容
  94. //atMobiles Array 否 被@人的手机号(在content里添加@人的手机号)
  95. //isAtAll bool 否 @所有人时:true,否则为:false
  96. OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
  97. text.setContent(content);
  98. OapiRobotSendRequest request = new OapiRobotSendRequest();
  99. if (!CollectionUtils.isEmpty(mobileList)) {
  100. // 发送消息并@ 以下手机号联系人
  101. OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
  102. at.setAtMobiles(mobileList);
  103. at.setIsAtAll(isAtAll ? "true" : "false");
  104. request.setAt(at);
  105. }
  106. request.setMsgtype(RobotHelperUtil.MSG_TYPE_TEXT);
  107. request.setText(text);
  108. OapiRobotSendResponse response = new OapiRobotSendResponse();
  109. try {
  110. response = RobotHelperUtil.client.execute(request);
  111. } catch (ApiException e) {
  112. log.error("[发送普通文本消息]: 发送消息失败, 异常捕获{}", e.getMessage());
  113. }
  114. return response;
  115. }
  116. /**
  117. * @description: 发送link 类型消息
  118. * @param title 消息标题
  119. * @param text 消息内容
  120. * @param messageUrl 点击消息后跳转的url
  121. * @param picUrl 插入图片的url
  122. * @return: com.dingtalk.api.response.OapiRobotSendResponse
  123. * @author: niaonao
  124. * @date: 2019/7/6
  125. */
  126. public static OapiRobotSendResponse sendMessageByLink(String title, String text, String messageUrl, String picUrl) {
  127. if (!DataValidUtil.checkNotEmpty(title, text, messageUrl)) {
  128. return null;
  129. }
  130. //参数 参数类型 必须 说明
  131. //msgtype String 是 消息类型,此时固定为:link
  132. //title String 是 消息标题
  133. //text String 是 消息内容。如果太长只会部分展示
  134. //messageUrl String 是 点击消息跳转的URL
  135. //picUrl String 否 图片URL
  136. OapiRobotSendRequest.Link link = new OapiRobotSendRequest.Link();
  137. link.setTitle(title);
  138. link.setText(text);
  139. link.setMessageUrl(messageUrl);
  140. link.setPicUrl(picUrl);
  141. OapiRobotSendRequest request = new OapiRobotSendRequest();
  142. request.setMsgtype(RobotHelperUtil.MSG_TYPE_LINK);
  143. request.setLink(link);
  144. OapiRobotSendResponse response = new OapiRobotSendResponse();
  145. try {
  146. response = RobotHelperUtil.client.execute(request);
  147. } catch (ApiException e) {
  148. log.error("[发送link 类型消息]: 发送消息失败, 异常捕获{}", e.getMessage());
  149. }
  150. return response;
  151. }
  152. /**
  153. * @description: 发送Markdown 编辑格式的消息
  154. * @param title 标题
  155. * @param markdownText 支持markdown 编辑格式的文本信息
  156. * @param mobileList 消息@ 联系人
  157. * @param isAtAll 是否@ 全部
  158. * @return: com.dingtalk.api.response.OapiRobotSendResponse
  159. * @author: niaonao
  160. * @date: 2019/7/6
  161. */
  162. public static OapiRobotSendResponse sendMessageByMarkdown(String title, String markdownText, List<String> mobileList, boolean isAtAll) {
  163. if (!DataValidUtil.checkNotEmpty(title, markdownText)) {
  164. return null;
  165. }
  166. //参数 类型 必选 说明
  167. //msgtype String 是 此消息类型为固定markdown
  168. //title String 是 首屏会话透出的展示内容
  169. //text String 是 markdown格式的消息
  170. //atMobiles Array 否 被@人的手机号(在text内容里要有@手机号)
  171. //isAtAll bool 否 @所有人时:true,否则为:false
  172. OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
  173. markdown.setTitle(title);
  174. markdown.setText(markdownText);
  175. OapiRobotSendRequest request = new OapiRobotSendRequest();
  176. request.setMsgtype(RobotHelperUtil.MSG_TYPE_MARKDOWN);
  177. request.setMarkdown(markdown);
  178. if (!CollectionUtils.isEmpty(mobileList)) {
  179. OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
  180. at.setIsAtAll(isAtAll ? "true" : "false");
  181. at.setAtMobiles(mobileList);
  182. request.setAt(at);
  183. }
  184. OapiRobotSendResponse response = new OapiRobotSendResponse();
  185. try {
  186. response = RobotHelperUtil.client.execute(request);
  187. } catch (ApiException e) {
  188. log.error("[发送link 类型消息]: 发送消息失败, 异常捕获{}", e.getMessage());
  189. }
  190. return response;
  191. }
  192. /**
  193. * @description: 整体跳转ActionCard类型的消息发送
  194. * @param title 消息标题, 会话消息会展示标题
  195. * @param markdownText markdown格式的消息
  196. * @param singleTitle 单个按钮的标题
  197. * @param singleURL 单个按钮的跳转链接
  198. * @param btnOrientation 是否横向排列(true 横向排列, false 纵向排列)
  199. * @param hideAvatar 是否隐藏发消息者头像(true 隐藏头像, false 不隐藏)
  200. * @return: com.dingtalk.api.response.OapiRobotSendResponse
  201. * @author: niaonao
  202. * @date: 2019/7/6
  203. */
  204. public static OapiRobotSendResponse sendMessageByActionCardSingle(String title, String markdownText, String singleTitle, String singleURL, boolean btnOrientation, boolean hideAvatar) {
  205. if (!DataValidUtil.checkNotEmpty(title, markdownText)) {
  206. return null;
  207. }
  208. //参数 类型 必选 说明
  209. // msgtype string true 此消息类型为固定actionCard
  210. // title string true 首屏会话透出的展示内容
  211. // text string true markdown格式的消息
  212. // singleTitle string true 单个按钮的方案。(设置此项和singleURL后btns无效)
  213. // singleURL string true 点击singleTitle按钮触发的URL
  214. // btnOrientation string false 0-按钮竖直排列,1-按钮横向排列
  215. // hideAvatar string false 0-正常发消息者头像,1-隐藏发消息者头像
  216. OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard();
  217. actionCard.setTitle(title);
  218. actionCard.setText(markdownText);
  219. actionCard.setSingleTitle(singleTitle);
  220. actionCard.setSingleURL(singleURL);
  221. // 此处默认为0
  222. actionCard.setBtnOrientation(btnOrientation ? "1" : "0");
  223. // 此处默认为0
  224. actionCard.setHideAvatar(hideAvatar ? "1" : "0");
  225. OapiRobotSendRequest request = new OapiRobotSendRequest();
  226. request.setMsgtype(RobotHelperUtil.MSG_TYPE_ACTION_CARD);
  227. request.setActionCard(actionCard);
  228. OapiRobotSendResponse response = new OapiRobotSendResponse();
  229. try {
  230. response = RobotHelperUtil.client.execute(request);
  231. } catch (ApiException e) {
  232. log.error("[发送ActionCard 类型消息]: 整体跳转ActionCard类型的发送消息失败, 异常捕获{}", e.getMessage());
  233. }
  234. return response;
  235. }
  236. /**
  237. * @description: 独立跳转ActionCard类型 消息发送
  238. * @param title 标题
  239. * @param markdownText 文本
  240. * @param btns 按钮列表
  241. * @param btnOrientation 是否横向排列(true 横向排列, false 纵向排列)
  242. * @param hideAvatar 是否隐藏发消息者头像(true 隐藏头像, false 不隐藏)
  243. * @return: com.dingtalk.api.response.OapiRobotSendResponse
  244. * @author: niaonao
  245. * @date: 2019/7/6
  246. */
  247. public static OapiRobotSendResponse sendMessageByActionCardMulti(String title, String markdownText, List<OapiRobotSendRequest.Btns> btns, boolean btnOrientation, boolean hideAvatar) {
  248. if (!DataValidUtil.checkNotEmpty(title, markdownText) || CollectionUtils.isEmpty(btns)) {
  249. return null;
  250. }
  251. //参数 类型 必选 说明
  252. //msgtype string true 此消息类型为固定actionCard
  253. //title string true 首屏会话透出的展示内容
  254. //text string true markdown格式的消息
  255. //btns array true 按钮的信息:title-按钮方案,actionURL-点击按钮触发的URL
  256. //btnOrientation string false 0-按钮竖直排列,1-按钮横向排列
  257. //hideAvatar string false 0-正常发消息者头像,1-隐藏发消息者头像
  258. OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard();
  259. actionCard.setTitle(title);
  260. actionCard.setText(markdownText);
  261. // 此处默认为0
  262. actionCard.setBtnOrientation(btnOrientation ? "1" : "0");
  263. // 此处默认为0
  264. actionCard.setHideAvatar(hideAvatar ? "1" : "0");
  265. actionCard.setBtns(btns);
  266. OapiRobotSendRequest request = new OapiRobotSendRequest();
  267. request.setMsgtype(RobotHelperUtil.MSG_TYPE_ACTION_CARD);
  268. request.setActionCard(actionCard);
  269. OapiRobotSendResponse response = new OapiRobotSendResponse();
  270. try {
  271. response = RobotHelperUtil.client.execute(request);
  272. } catch (ApiException e) {
  273. log.error("[发送ActionCard 类型消息]: 独立跳转ActionCard类型发送消息失败, 异常捕获{}", e.getMessage());
  274. }
  275. return response;
  276. }
  277. /**
  278. * @description: 发送FeedCard类型消息
  279. * @param links
  280. * @return: com.dingtalk.api.response.OapiRobotSendResponse
  281. * @author: niaonao
  282. * @date: 2019/7/6
  283. */
  284. public static OapiRobotSendResponse sendMessageByFeedCard(List<OapiRobotSendRequest.Links> links) {
  285. if (CollectionUtils.isEmpty(links)) {
  286. return null;
  287. }
  288. //msgtype string true 此消息类型为固定feedCard
  289. //title string true 单条信息文本
  290. //messageURL string true 点击单条信息到跳转链接
  291. //picURL string true 单条信息后面图片的URL
  292. OapiRobotSendRequest.Feedcard feedcard = new OapiRobotSendRequest.Feedcard();
  293. feedcard.setLinks(links);
  294. OapiRobotSendRequest request = new OapiRobotSendRequest();
  295. request.setMsgtype(RobotHelperUtil.MSG_TYPE_FEED_CARD);
  296. request.setFeedCard(feedcard);
  297. OapiRobotSendResponse response = new OapiRobotSendResponse();
  298. try {
  299. response = RobotHelperUtil.client.execute(request);
  300. } catch (ApiException e) {
  301. log.error("[发送ActionCard 类型消息]: 独立跳转ActionCard类型发送消息失败, 异常捕获{}", e.getMessage());
  302. }
  303. return response;
  304. }
  305. /*public static void main(String args[]) {
  306. sdkDemoJava();
  307. }*/
  308. }

钉钉机器人SDK 封装预警消息发送工具的更多相关文章

  1. Java 基于mail.jar 和 activation.jar 封装的邮件发送工具类

    准备工作 发送邮件需要获得协议和支持! 开启服务 POP3/SMTP 服务 如何开启 POP3/SMTP 服务:https://www.cnblogs.com/pojo/p/14276637.html ...

  2. Asp.Net Core对接钉钉群机器人

    钉钉作为企业办公越来越常用的软件,对于企业内部自研系统提供接口支持,以此来打通多平台下的数据,本次先使用最简单的钉钉群机器人完成多种形式的消息推送,参考钉钉开发文档中自定义机器人环节,此次尝试所花的时 ...

  3. 钉钉机器人集成Jenkins推送消息模板自定义发送报告

    一.由于公司同样也使用了钉钉.那么在做Jenkins集成自动化部署的时候,也是可以集成钉钉的. 那种Jenkins下载钉钉插件集成,简单设置就可以完成了.我们今天要做的是,定制化的发送消息. 钉钉推送 ...

  4. springboot使用RestTemplate以post方式发送json字符串参数(以向钉钉机器人发送消息为例)

    使用springboot之前,我们发送http消息是这么实现的 我们用了一个过时的类,虽然感觉有些不爽,但是出于一些原因,一直也没有做处理,最近公司项目框架改为了springboot,springbo ...

  5. python 钉钉机器人发送消息

    import json import requests def sendmessage(message): url = 'https://oapi.dingtalk.com/robot/send?ac ...

  6. TFS发布计划发送到钉钉消息群

    由于工作中需要用到钉钉,每天都要和钉钉打交道:上下班打卡.出差请假流程.各种工作讨论组,不一而足,工作已然和钉钉绑在了一起,难怪有广告词: 微信是一个生活方式,钉钉是一个工作方式. 我们是钉钉机器人内 ...

  7. 钉钉自定义机器人配合SVN钩子事件进行消息的推送实践

    目前很多公司还是使用SVN(TortoiseSVN)进行版本控制,使用简单,适合管理一般项目.协同办公软件目前钉钉比较成熟,阿里也一直在宣传推广,这两年公司也在使用,主要用于信息的沟通,其它的绩效.考 ...

  8. .Net调用钉钉接口,实现发送企业消息功能

    我在钉钉官网上看了下,关于调用钉钉接口,发送企业消息通知,他给的核心代码总共几行. 用到的一个接口引用 TopSDK.dll 下载网址https://open-doc.dingtalk.com/doc ...

  9. 用python写一个预警机器人(支持微信和钉钉)

    背景 线上的系统在运行中,发生故障时怎么及时的通过手机通知到相关人员?当然这是个很简单的需求,现有的方法有很多,例如: 如果我们用的云产品,那么一般都会有配套对应的监控预警功能,根据需要配置一下即可, ...

随机推荐

  1. linux性能分析工具Uptime

  2. 同步与异步,阻塞与非阻塞 bio,nio,aio

    BIO.NIO和AIO的区别(简明版) 同步异步,阻塞非阻塞: https://www.zhihu.com/question/19732473   转载请注明原文地址:http://www.cnblo ...

  3. CentOS-7 开放80端口

    转载声明:本文转载 原文:https://blog.csdn.net/u013310075/article/details/80983117 关闭与开启防火墙 systemctl stop firew ...

  4. ConcurrentLinkedQueue和LinkedBlockingQueue区别

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11394436.html 线程安全队列类图 两者的区别在于 ConcurrentLinkedQueue基 ...

  5. 欢迎页jsp

    <!-- 拦截设置 --><servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> ...

  6. 使用C#获取IP地址方法

    C#中如何获取IP地址?,看到问题的时候我也很纠结,纠结的不是这个问题是如何的难回答,而是纠结的是这些问题都是比较基本的常识,也是大家会经常用到的.但是却不断的有人问起,追根究底的原因估计就是没有好好 ...

  7. 【LeetCode 85】最大矩形

    题目链接 [题解] 把所有的"1"矩形分成m类. 第j类的矩形.他的右边界跟第j列紧靠. 那么. 我们设f[i][j]表示(i,j)这个点往左最长能延伸多少个数目的"1& ...

  8. 【CF1257B】Magic Stick【思维】

    题意:每次可以对a进行两种操作,1:如果是偶数,则变成3*a/2:2:变成a-1 显然当a=1时,b只能为1 a=2或3时,b只能为123 a>3时,b可以为任意数 代码: #include&l ...

  9. Linux 性能检测常用的10个基本命令

    1.   uptime $ uptime 23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.0212 该命令可以大致的看出计算机的整体 ...

  10. ARC093 F Dark Horse——容斥

    题目:https://atcoder.jp/contests/arc093/tasks/arc093_d #include<cstdio> #include<cstring> ...