本节主要介绍使用消息解析和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. C# Socket教程入门,Socket的使用方法,附可执行Demo

    核心: 在服务器端和客户端的两个Socket实例,共同维持一个连接,而我们还需要一个服务端绑定了特定端口号的固定的serverSocket,用来监听远方clientSocket的申请,并为这个申请建立 ...

  2. 学习EXTJS6(9)面向对象的基础框架-1

    Ext创造一套精细的对象模型与API,用这套API,可以快速实现对象的定义.创建.继承和扩展:1. 1.创建新类 Ext.define('demo.Demo',{ name: 'usegear', h ...

  3. 枚举与string之间查找与转换

    利用TypInfo单元的GetEnumName和GetEnumValue可以遍历任意枚举类型 其实上面程序运行会有err,为什么?因为没有理解和掌握JSON Objects Framework[感到简 ...

  4. zk源码—4.会话的实现原理

    大纲 1.创建会话 (1)客户端的会话状态 (2)服务端的会话创建 (3)会话ID的初始化实现 (4)设置的会话超时时间没生效的原因 2.分桶策略和会话管理 (1)分桶策略和过期队列 (2)会话激活 ...

  5. FastAPI安全认证中的依赖组合

    title: FastAPI安全认证中的依赖组合 date: 2025/04/12 00:44:08 updated: 2025/04/12 00:44:08 author: cmdragon exc ...

  6. SpringMVC处理请求源码分析

    一.先从Servlet案例说起 1.编写Servlet代码 2.配置web.xml(可选) 二.从DispatcherServlet说起 有Servlet基础的同学应该都知道,前端的每一个请求都会由一 ...

  7. IOC容器启动及Bean生成流程

    目录 一.容器启动 IOC启动流程 重点 二.扫描并注册BeanDefination 加载并过滤资源 注册BeanDefination 三.BeanFactory后置处理 四.注册Bean后置处理器 ...

  8. CTF实验吧认真一点 SQL盲注

    实验吧地址 http://ctf5.shiyanbar.com/web/earnest/index.php 很明显的返回两个不同得页面,判断为SQL盲注 并且 过滤了敏感字符 测试的时候还发现过滤了s ...

  9. Java编程--简单的Proxy程序(代理设计模式)

    有时候对象要完成某项任务(功能)需要很多步骤,而这些步骤全部交给对象自己完成显然是不现实的,就像我们人要吃饭,你总不能要求我们每个人都去种地.打面.做饭一样,我们只需要完成其中的吃饭这一核心操作就可以 ...

  10. K8s Service 示例详解

    Kubernetes 官方文档:Services-Networking Service介绍 在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地 ...