Webcat是一个基于netty的简单、高性能服务端框架,目前提供http和websocket两种协议的快速开发模式。webcat采用spring进行对象管理,因此工程需要依赖spring框架,Github地址。
下载源代码后,可以直接运行WebcatServerTest启动http和websocket服务,然后通过pytest文件夹中的两个python脚本对服务进行测试。
HTTP Server 使用
在spring的配置中,加上对webcat的package扫描:
1
| <context:component-scan base-package="com.lchml.webcat"/>
|
设置端口并启动:
1 2 3 4 5
| public static void main(String[] args) throws WebcatStartException { HttpServer httpServer = context.getBean(WebcatHttpServer.class); httpServer.setPort(8080); httpServer.start(); }
|
添加自己的controller:
1
| <context:component-scan base-package="com.lchml.test"/>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @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。
1 2 3 4 5
| <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扫描:
1
| <context:component-scan base-package="com.lchml.webcat"/>
|
设置端口,设置连接初始化和断开的监听回调并启动:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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:
1
| <context:component-scan base-package="com.lchml.test"/>
|
1 2 3 4 5 6 7 8
| @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内容。
1 2 3 4 5 6
| <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格式做协议交互,格式如下:
1 2 3 4 5 6
| { "path": "/test/hello", "mid": 1, "version": 0, "params": {"name": "holyshit"} }
|
所有的请求最后都会被组装为WsContext对象:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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中方法定义映射到对应的参数上。