本节主要介绍使用消息解析和handler分发

一:定义一个常量类,储存消息id

public class HandlerCode {
/***** 测试接口 ******/
public static final short DAILY_LEVEL = 101;
}

定义一个返回信息枚举类

 1 public enum HttpStatus {
2 OK(200, "success"),
3 PLAYER_REGISTER(201,"head register"),
4 REDIRECT_LOGIN(202,"remote device login"),
5
6 ERROR(501, "error"),
7 JSON_ERROR(502,"json error"),
8 PARAMETER_ERROR(503,"parameter error");
9
10 private final int code;
11 private final String message;
12
13 HttpStatus(int code, String message) {
14 this.code = code;
15 this.message = message;
16 }
17
18 public int code() {
19 return code;
20 }
21
22 public String message() {
23 return message;
24 }
25 }

二:新建一个返回错误编码类

 1 public class NetDownError extends AbstractDownMessage {
2 public NetDownError(short requestId, HttpStatus status){
3 this.messageId = requestId;
4 this.resultCode = status.code();
5 }
6
7 @Override
8 protected void encodeBody() {
9
10 }
11 }

三:修改httpServerVerticle解析消息。红色为修改的地方。

public class HttpServerVerticle extends AbstractVerticle {
private final Logger logger = LoggerFactory.getLogger(HttpServerVerticle.class);
private HttpServer httpServer; private IMessageRecognizer recognizer; @Override
public void start(Promise<Void> startPromise) throws Exception {
recognizer = new MessageRecognizer(); HttpServerOptions options = new HttpServerOptions()
.setIdleTimeout(10000)
.setIdleTimeoutUnit(TimeUnit.MILLISECONDS)
.setTcpKeepAlive(true); httpServer = vertx.createHttpServer(options);
httpServer.exceptionHandler( it -> {
if(it instanceof IOException){
logger.error("\n ---network io error:"+it.getMessage());
return;
}
logger.error("\n ---net error:"+it.getMessage());
}); // httpServer.requestHandler(req -> {
// HttpServerResponse resp = req.response().setStatusCode(200);
// resp.putHeader("content-type", "application/json");
// resp.putHeader("connection", "Keep-Alive");
//
// JsonObject js = new JsonObject().put("ke","demos");
// resp.end(js.encode());
// });

httpServer.requestHandler(this
::handleRequest);
httpServer.listen(8888,"127.0.0.1",res -> {
if (res.succeeded()) {
startPromise.complete();
logger.info("HTTP server started on port 8888");
} else {
startPromise.fail(res.cause());
logger.error(res.cause().getMessage());
}
});
} private void handleRequest(HttpServerRequest request){
request.bodyHandler(body -> {
HttpServerResponse resp = request.response().setStatusCode(200);
resp.putHeader("content-type", "application/json");
resp.putHeader("connection", "Keep-Alive"); //解析上传的json数据
JsonObject upData = AbstractMessage.decodeUpMessage(body);
if(upData == null){
//上传json参数有误
AbstractDownMessage output = new NetDownError((short)-1, HttpStatus.JSON_ERROR);
output.encode();
resp.end(output.SendMessage()); logger.error("json error: \n" + body.toString());
return;
} AbstractDownMessage output;
short messageId = upData.getInteger("mId",-1).shortValue();
MessageFactory input = recognizer.recognize(messageId);
if(input == null){
output = new NetDownError((short)-1,HttpStatus.ERROR);
output.encode();
resp.end(output.SendMessage());
return;
} InterHandler handlerManager = HandlerManager.getInstance().getHandler(messageId);
if(handlerManager == null){
logger.error("not handler :"+messageId);
output = new NetDownError(messageId,HttpStatus.ERROR);
output.encode();
resp.end(output.SendMessage());
return
;
} input.decode(messageId,upData,request);
handlerManager.handler((AbstractUpMessage)input,resp);
});
}
@Override
public void stop(){
httpServer.close();
logger.error(" AppLogin Server stop ------");
}

四:因为还没有测试handler,所以启动服务器返回会返回code:501

项目结构:

Vertx 实现webapi实战项目(四)的更多相关文章

  1. Vuejs实战项目四:权限校验

    路由跳转参考文档:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html 在/src下创建permission.js进行权限 ...

  2. C# WebApi+Task+WebSocket实战项目演练(四)

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第四部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...

  3. ASP.NET WebAPI数据传输安全HTTPS实战项目演练

    一.课程介绍 HTTPS是互联网 Web 大势所趋,各大网站都已陆续部署了 HTTPS .  全站HTTPS时代,加密用户与网站间的交互访问,在客户端浏览器和Web服务器之间建立安全加密通道,一般情况 ...

  4. .NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练

    写在前面 上篇文章我带着大家通过分析了一遍ASP.NET Core的源码了解了它的启动过程,然后又带着大家熟悉了一遍配置文件的加载方式,最后引出了依赖注入以及控制反转的概念!如果大家把前面几张都理解了 ...

  5. Android项目实战(四十九):Andoird 7.0+相机适配

    解决方案类似: Android项目实战(四十):Andoird 7.0+ 安装APK适配 解决方法: 一.在AndroidManifest.xml 文件中添加 四大组件之一的 <provider ...

  6. Android项目实战(四十四):Zxing二维码切换横屏扫描

    原文:Android项目实战(四十四):Zxing二维码切换横屏扫描 Demo链接 默认是竖屏扫描,但是当我们在清单文件中配置横屏显示的时候: <activity android:name=&q ...

  7. Android项目实战(四十):在线生成按钮Shape的网站

    原文:Android项目实战(四十):在线生成按钮Shape的网站 AndroidButton Make  右侧设置按钮的属性,可以即时看到效果,并即时生成对应的.xml 代码,非常高效(当然熟练的话 ...

  8. 项目四:Java秒杀系统方案优化-高性能高并发实战

    技术栈 前端:Thymeleaf.Bootstrap.JQuery 后端:SpringBoot.JSR303.MyBatis 中间件:RabbitMQ.Redis.Druid 功能模块 分布式会话,商 ...

  9. Vue2+VueRouter2+webpack 构建项目实战(四)接通api,先渲染个列表

    Vue2+VueRouter2+webpack 构建项目实战(四)接通api,先渲染个列表:  Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(一)基础知识概述

  10. .NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理

    通过 ASP.NET Core,开发者可轻松配置和管理其应用的安全性. ASP.NET Core 中包含管理身份验证.授权.数据保护.SSL 强制.应用机密.请求防伪保护及 CORS 管理等等安全方面 ...

随机推荐

  1. netstat 与 ss 比较

    一.netstat 命令 1. 核心功能 显示网络连接.路由表.接口统计等信息. 支持TCP.UDP.UNIX域套接字等协议. 可查看进程与端口的关联. 2. 常用语法示例 查看所有活动连接 nets ...

  2. Netty源码—10.Netty工具之时间轮

    大纲 1.什么是时间轮 2.HashedWheelTimer是什么 3.HashedWheelTimer的使用 4.HashedWheelTimer的运行流程 5.HashedWheelTimer的核 ...

  3. DevOps工程师技能

    技术背景 DevOps工程师必须持有计算机科学.工程或其他相关领域的学位.2年以上工作经验.这包括开发人员.系统管理员或devops驱动的团队成员的工作.这是一个重要的需求,同时也是对所有IT操作的理 ...

  4. 🎀FreeMarker 禁止自动转义标签-noautoesc

    简介 FreeMarker 是一个用 Java 语言编写的模板引擎,它被设计用来生成文本输出(HTML 网页.电子邮件.配置文件等).在 FreeMarker 中,默认情况下,当你在模板中输出变量时, ...

  5. Redis实现高并发场景下的计数器设计

    大部分互联网公司都需要处理计数器场景,例如风控系统的请求频控.内容平台的播放量统计.电商系统的库存扣减等. 传统方案一般会直接使用RedisUtil.incr(key),这是最简单的方式,但这种方式在 ...

  6. 工良出品 | 长文讲解 MCP 和案例实战

    作者:痴者工良 博客地址:https://www.whuanle.cn/ 示例项目地址:https://github.com/whuanle/mcpdemo 近期 MCP 协议越来越爆火,很多开发者都 ...

  7. 有的时候,可能会继承基础样式,利用BasedOn="{StaticResource {x:Type TextBlock}}"

    有的时候,可能会继承基础样式,利用BasedOn="{StaticResource {x:Type TextBlock}}" 例如: 1 <Window x:Class=&q ...

  8. C# 线程(一)——基础概念(线程与进程、前后台线程)

    一.基础概念 1.1线程与进程 线程--是一个可执行路径,它可以独立于其他线程执行. 进程--每个线程都在操作系统的进程(Process)内执行,而操作系统则提供了程序运行的独立环境,它提供了一个应用 ...

  9. C++ lambda匿名函数

    Lambda 表达式完整的格式如下: [捕获列表] (形参列表) mutable 异常列表-> 返回类型 { 函数体 } 各项的含义: 捕获列表:捕获外部变量,捕获的变量可以在函数体中使用,可以 ...

  10. OpenPPL的执行流程与类间关系UML表达

    上一讲,对OpenPPL进行了介绍,以及通过官方文档,学习了它的python与C++的操作流程,以及如添加新的引擎与Op算子. 本节,将通过阅读代码通过UML梳理操作流程以及类之间的相互关系 src地 ...