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


代碼地址如下:
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大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM