webcat——基于netty的http和websocket框架
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框架
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
webcat——基于netty的http和websocket框架的更多相关文章
- 造个轮子之基于 Netty 实现自己的 RPC 框架
原文地址: haifeiWu和他朋友们的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢! 服务端开发都会或多或少的涉及到 RPC 的使用,当然如果止步于会用,对 ...
- 基于JSR-356实现的Tyrus WebSocket框架的消息传递机制初步了解
对阻塞.非阻塞,同步.异步初步了解了,不是太明白,其中大多数将的是对于CPU的使用率及对一个事件的处理效率. 阻塞与非阻塞各有优缺点,在知乎上也看到了下面的结论: 在处理 IO 的时候,阻塞和非阻塞都 ...
- 一款基于Netty开发的WebSocket服务器
代码地址如下:http://www.demodashi.com/demo/13577.html 一款基于Netty开发的WebSocket服务器 这是一款基于Netty框架开发的服务端,通信协议为We ...
- 基于netty轻量的高性能分布式RPC服务框架forest<下篇>
基于netty轻量的高性能分布式RPC服务框架forest<上篇> 文章已经简单介绍了forest的快速入门,本文旨在介绍forest用户指南. 基本介绍 Forest是一套基于java开 ...
- 基于netty轻量的高性能分布式RPC服务框架forest<上篇>
工作几年,用过不不少RPC框架,也算是读过一些RPC源码.之前也撸过几次RPC框架,但是不断的被自己否定,最近终于又撸了一个,希望能够不断迭代出自己喜欢的样子. 顺便也记录一下撸RPC的过程,一来作为 ...
- 基于netty框架的Socket传输
一.Netty框架介绍 什么是netty?先看下百度百科的解释: Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开 ...
- DIY一些基于netty的开源框架
几款基于netty的开源框架,有益于对netty的理解和学习! 基于netty的http server框架 https://github.com/TogetherOS/cicada 基于netty的即 ...
- 一个基于netty的websocket聊天demo
这里,仅仅是一个demo,模拟客户基于浏览器咨询卖家问题的场景,但是,这里的demo中,卖家不是人,是基于netty的程序(我就叫你uglyRobot吧),自动回复了客户问的问题. 项目特点如下: 1 ...
- 《Java 编写基于 Netty 的 RPC 框架》
一 简单概念 RPC: ( Remote Procedure Call),远程调用过程,是通过网络调用远程计算机的进程中某个方法,从而获取到想要的数据,过程如同调用本地的方法一样. 阻塞IO :当阻塞 ...
随机推荐
- 谈谈dpdk应用层包处理程序的多进程和多线程模型选择时的若干考虑
看到知乎上有个关于linux多进程.多线程的讨论:http://www.zhihu.com/question/19903801/answer/14842584 自己项目里也对这个问题有过很多探讨和测试 ...
- 自己写操作系统 2 - 安装bochs虚拟机
以ubuntu操作系统为例 一.命令行安装 sudo apt-get install vgabios bochs bochs-x bximage 此方法方便,不过都说这个方法安装的bochs没有调试功 ...
- bottle框架学习(2):变量定义等
try: from simplejson import dumps as json_dumps, loads as json_lds except ImportError: # pragma: no ...
- 本地虚拟机在ubuntu系统搭建nexus服务器
本地虚拟机在ubuntu系统上搭建nexus服务器 本地虚拟机在ubuntu系统上搭建nexus服务器所需软件: 虚拟机:VM或者Oracle VM VirtualBox 系统:ubuntu-14.0 ...
- vs code 在windows10 64bit系统配置python开发环境
一.搭建 python 环境 在 VSC 中点击 F1 键,弹出控制台,输入 ext install 界面左侧弹出扩展窗格,输入python,确认,开始搜索下载发布者为Don Jayamanne 的 ...
- J.U.C并发框架源码阅读(七)CyclicBarrier
基于版本jdk1.7.0_80 java.util.concurrent.CyclicBarrier 代码如下 /* * ORACLE PROPRIETARY/CONFIDENTIAL. Use is ...
- Tarjan缩点+LCA【p2783】有机化学之神偶尔会做作弊
Description 你翻到那一题:给定一个烃,只含有单键(给初中生的一个理解性解释:就是一堆碳用横线连起来,横线都是单条的). 然后炎魔之王拉格纳罗斯用他的火焰净化了一切环(???).所有的环状碳 ...
- 线段树【 bzoj3132 】【p4145 】上帝造题的七分钟2 / 花神游历各国
题目大意 给定一个区间 支持开方和查询区间值操作 (多组数据 分析 如果一个区间的最大值小于1,那就没有开方的必要了(具体不会证明,听大佬讲的 一个数经过多次开方就会变成1(可以用计算器试一下 因此我 ...
- [POI2006]Periods of Words
题目大意: 给定一个长度为$n(n\leq10^6)$的字符串$S$,定义一个串$S$的最大周期为一个不为$S$的字符串$Q$,满足$Q$为$S$的前缀且$S$为$QQ$的前缀.求字符串$S$的每一个 ...
- [COCI2015]JABUKE
题目大意: 一个$n\times m(n,m\leq500)$的网格图中有若干个标记点,有$q(q\leq10^5)$个操作,每次新加入一个标记点,并询问和新加入点最近的点的距离. 思路: 记录对于每 ...