本节主要介绍使用消息解析和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. Delphi Inputbox 输入时显示‘*’号

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  2. SQL语句(一)—— DDL

    SQL 全称 Structured Query Language,结构化查询语言.操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 . 一.SQL 基础知识 (一)SQL 通用语法 在学 ...

  3. System V信号量 vs. POSIX信号量:核心区别与选型指南

    System V信号量 vs. POSIX信号量:核心区别与选型指南 最近在学习linux系统编程的章节,接触到了两种信号量,所以专门研究了二者的区别,将二者的对比记录于此. 在Linux多线程/进程 ...

  4. SpringBoot 部署:外置依赖包

    目录: 1.前言 2.瘦身前的Jar包 3.解决方案 一.前言 SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼:编 ...

  5. 基于MySQL分析线上充值留存率

    1.数据清洗 步骤: 1.查询charge_record表业务类型为充值且订单状态为成功的数据 2.将上述数据转移到本地数据库 使用如下脚本: # coding=utf-8import pymysql ...

  6. QT 可绑定属性 QProperty QObjectBindableProperty QObjectComputedProperty,简化信号、槽(SIGNAL、SLOT)机制的方法

    QT提供的可绑定属性是指这些属性可以绑定到其他值或表达式上(通常是 C++ lambda 表达式).如果属性是通过表达式进行绑定,该属性会跟随表达式自动更新.可绑定属性由 QProperty 类和 Q ...

  7. php版10大设计模式,软件工程必须掌握的姿势

    作为一个半路出家的php萌新,在看公司老大们的代码时无时无刻不在感叹,老大就是老大,写的代码低耦合.易扩展,我怎么就想不出这写完美的实现方式,最近看了韩大佬的视频后才明白,原来这些都是业界前辈们总结提 ...

  8. tp5 分页权限权限设置显示

    $adminid = cookie("adminid"); $shop_id=$this->get_shop_id(); if($adminid==1){ $uid = in ...

  9. Asp.net core 少走弯路系列教程(七)WebApi 学习

    前言 新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力. 新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马. 作者认 ...

  10. ServletContext相关

    简介 如何得到对象 有什么作用 1.获取全局配置参数 2.获取web工程中的资源 3.存取数据,servlet间共享数据 域对象 ServlerContext的生命周期 ServletContext ...