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大師代發,拒絕轉載,轉載需要作者授權
