代码地址如下:
http://www.demodashi.com/demo/12687.html

Webcat是一个基于netty的简单、高性能服务端框架,目前提供http和websocket两种协议的快速开发模式。webcat采用spring进行对象管理,因此工程需要依赖spring框架,Github地址

下载源代码后,可以直接运行WebcatServerTest启动http和websocket服务,然后通过pytest文件夹中的两个python脚本对服务进行测试。

HTTP Server 使用

在spring的配置中,加上对webcat的package扫描:

<context:component-scan base-package="com.lchml.webcat"/>

设置端口并启动:

public static void main(String[] args) throws WebcatStartException {
HttpServer httpServer = context.getBean(WebcatHttpServer.class);
httpServer.setPort(8080);
httpServer.start();
}

添加自己的controller:

<context:component-scan base-package="com.lchml.test"/>
@HttpController(path = "/test")
public class TestController { @HttpRequestMapping(path = "/hello", consumes = {"text/plain"})
public String testHello() {
return "hello webcat";
} @HttpRequestMapping(path = "/bodytest", method = {ReqMethod.POST})
public String testBody(@ReqBody String body) {
return "hello webcat " + body;
} @HttpRequestMapping(path = "/redirect", method = {ReqMethod.GET})
public void testRedirect(FullHttpResponse response) {
ResponseUtil.redirect(response, "http://lchml.com");
}
}
  • logEnable,默认会打开所有websocket请求的日志。
  • logResponse,默认日志中不会输入response内容。
  • defaultProduce,默认返回content-type为application/json;charset=utf-8。
<bean class="com.lchml.webcat.config.WebcatHttpConf" id="webcatConf">
<property name="logEnable" value="true"/>
<property name="logResponse" value="true"/>
<property name="defaultProduce" value="application/json;charset=utf-8"/>
</bean>

Websocket Server 使用

在spring的配置中,加上对webcat的package扫描:

<context:component-scan base-package="com.lchml.webcat"/>

设置端口,设置连接初始化和断开的监听回调并启动:

public static void main(String[] args) throws WebcatStartException {
WebcatWsServer wsServer = context.getBean(WebcatWsServer.class);
wsServer.setPort(8081);
wsServer.setChannelConnectListener(new ChannelConnectListener() {
@Override public void connect(ChannelInfo channelInfo) {
channelInfo.addAttr("connectTime", System.currentTimeMillis());
System.out.println(channelInfo.getClientIp() + " connect");
}
});
wsServer.setChannelDisconnectListener(new ChannelDisconnectListener() {
@Override public void disconnect(ChannelInfo channelInfo) {
System.out.println(channelInfo.getClientIp() + " disconnect");
}
}); wsServer.start();
}

添加自己的controller:

<context:component-scan base-package="com.lchml.test"/>
@WsController(path = "/test")
public class TestWsController { @WsRequestMapping(path = "/hello")
public Object testHello(String name, WsContext ctx) {
return "hello webcat " + name + " from " + ctx.getCi().getClientIp();
}
}
  • heartbeat,默认心跳为15s,超过15s没有收到客户端心跳则视为连接断开。
  • useProxy,默认没有使用代理,则直接使用RemoteAddress作为客户端ip,如果设置为true,会从路由信息中获取真实客户端ip地址。
  • wsPath,默认path为/webcat,可以自行修改。
  • logEnable,默认会打开所有websocket请求的日志。
  • logResponse,默认日志中不会输入response内容。
<bean class="com.lchml.webcat.config.WebcatWsConf" id="webcatConf">
<property name="heartbeat" value="15"/>
<property name="useProxy" value="false"/>
<property name="logResponse" value="true"/>
<property name="logEnable" value="true"/>
</bean>

websocket模式,采用json格式做协议交互,格式如下:

{
"path": "/test/hello", // 请求的path,对应controller中的path
"mid": 1, // 请求的序号,用于对应请求和回包
"version": 0, // 版本号,可不用
"params": {"name": "holyshit"} // 业务的参数
}

所有的请求最后都会被组装为WsContext对象:

public class WsContext {
private String path; private ChannelInfo ci; private int mid; private int version; private Channel channel; private Map<String, Object> params;
}

其中,ChannelInfo中会包含请求方的客户端ip,并且可以在ChannelConnectListener中自定义其他属性,params默认会根据Controller中方法定义映射到对应的参数上。

其他补充

项目结构截图如下



webcat——基于netty的http和websocket框架

代码地址如下:
http://www.demodashi.com/demo/12687.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

webcat——基于netty的http和websocket框架的更多相关文章

  1. 造个轮子之基于 Netty 实现自己的 RPC 框架

    原文地址: haifeiWu和他朋友们的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢! 服务端开发都会或多或少的涉及到 RPC 的使用,当然如果止步于会用,对 ...

  2. 基于JSR-356实现的Tyrus WebSocket框架的消息传递机制初步了解

    对阻塞.非阻塞,同步.异步初步了解了,不是太明白,其中大多数将的是对于CPU的使用率及对一个事件的处理效率. 阻塞与非阻塞各有优缺点,在知乎上也看到了下面的结论: 在处理 IO 的时候,阻塞和非阻塞都 ...

  3. 一款基于Netty开发的WebSocket服务器

    代码地址如下:http://www.demodashi.com/demo/13577.html 一款基于Netty开发的WebSocket服务器 这是一款基于Netty框架开发的服务端,通信协议为We ...

  4. 基于netty轻量的高性能分布式RPC服务框架forest<下篇>

    基于netty轻量的高性能分布式RPC服务框架forest<上篇> 文章已经简单介绍了forest的快速入门,本文旨在介绍forest用户指南. 基本介绍 Forest是一套基于java开 ...

  5. 基于netty轻量的高性能分布式RPC服务框架forest<上篇>

    工作几年,用过不不少RPC框架,也算是读过一些RPC源码.之前也撸过几次RPC框架,但是不断的被自己否定,最近终于又撸了一个,希望能够不断迭代出自己喜欢的样子. 顺便也记录一下撸RPC的过程,一来作为 ...

  6. 基于netty框架的Socket传输

    一.Netty框架介绍 什么是netty?先看下百度百科的解释:         Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开 ...

  7. DIY一些基于netty的开源框架

    几款基于netty的开源框架,有益于对netty的理解和学习! 基于netty的http server框架 https://github.com/TogetherOS/cicada 基于netty的即 ...

  8. 一个基于netty的websocket聊天demo

    这里,仅仅是一个demo,模拟客户基于浏览器咨询卖家问题的场景,但是,这里的demo中,卖家不是人,是基于netty的程序(我就叫你uglyRobot吧),自动回复了客户问的问题. 项目特点如下: 1 ...

  9. 《Java 编写基于 Netty 的 RPC 框架》

    一 简单概念 RPC: ( Remote Procedure Call),远程调用过程,是通过网络调用远程计算机的进程中某个方法,从而获取到想要的数据,过程如同调用本地的方法一样. 阻塞IO :当阻塞 ...

随机推荐

  1. unicode和utf8之间的关系

    ,字符编码是计算机技术的基石,想要熟练使用计算机,懂得一点字符编码的知识,还是很有必要的. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit ...

  2. mysql 共享空间转为独立表空间

    由于以前的mysql配置为共享表空间,服务器空间不足,清理日志表里的数据后,数据库并没缩小,照成空间浪费,现在修改为独立表空间 #独立表空间innodb_file_per_table=1 #停止事物日 ...

  3. centos7刚安装需要的一些基础优化

    基本操作一:更改主机名 centos7有一个新的修改主机名的命令hostnamectl # hostnamectl set-hostname --static benjamin # vim /etc/ ...

  4. AC日记——Array Queries codeforces 797e

    797E - Array Queries 思路: 分段处理: 当k小于根号n时记忆化搜索: 否则暴力: 来,上代码: #include <cmath> #include <cstdi ...

  5. 牛客网 牛客练习赛7 B.购物-STL(priority_queue)

    B.购物 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 在遥远的东方,有一家糖果专卖店 这家糖果 ...

  6. hiho一下第131周 后缀自动机二·重复旋律8(循环相似子串)

    后缀自动机五·重复旋律8 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 小Hi ...

  7. Quaternion Euler

    geometry_msgs::Quaternion orientation = map->info.origin.orientation;      tf::Matrix3x3 mat(tf:: ...

  8. 【bzoj1076】【SCOI2008】【奖励关】期望最优值dp

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60582219 Description 你正在玩你 ...

  9. [USACO09MAR]Cleaning Up

    题目大意: 给你一个长度为n的序列a,你可以将其分为若干段,最终的答案为每一段不同数个数的平方和. 思路: 不难想到一个O(n^2)的DP: f[i]=min{f[j]+cnt(j,i)^2} 考虑一 ...

  10. SQL PARTITION BY:列值改变时重置计数

    现有数据如下: 需求:以科目为单位 对分数进行排序 SELECT *, ROW_NUMBER() OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS NUM FROM ...