Giter Club home page Giter Club logo

xnetter's Introduction

    xnetter是基于netty的网络架构,目的是简单易用。
    用户只需要关心基础数据和业务逻辑,对网络通信的过程、网络数据的编解码、加解密、路由转发无
需关心。目前实现了http/https、websocket/wss、tcp和udp网络过程的封装。其中tcp支持SSL,tcp和udp
支持其他加解密, 只不过目前加密算法只有RC4,后面再扩展其他的。

1 netty介绍
    netty是jboss提供的一个java开源框架,netty提供异步的、事件驱动的网络应用程序框架和工具,
用以快速开发高性能、高可用性的网络服务器和客户端程序。也就是说netty是一个基于nio的编程框
架,使用netty可以快速的开发出一个网络应用。

2 http(server)
    通过HttpServer启动http服务器,该服务会自动扫描Action路径下的所有类进行注册。下面是http
请求的整个流程。已经支持https,通过HttpConf去配置。支持文件上传、文件下载、文件直接展示。
    HttpClient(WEB) -> HttpHandler -> HttpRouter -> Decode -> Encode -> Action
    HttpServer接收到客户端的连接,都会启动一个新的HttpHandler。当HttpHandler接收到客户端
数据请求,会根据请求路径找HttpRouter查询相应的Action。调用Decoder对Request请求参数和请求内
容进行解析,并通过Encoder将解析结果转换为Action的响应函数需要的参数数组,最后执行该响应函数,
并将执行结果返回给客户端。
    http请求参数到Action响应函数参数的映射,支持下面的几种方式:
    基础类型 -> 基础类型
    数组    -> 数组/List/Set
    JSON    -> Map/Bean
    文件上传 -> FileUpload

    http还提供过滤器HttpFilter来过滤请求,返回的Result为空则继续后面的请求,否则根据Result
直接返回给客户端。HttpFilter的使用可以是参数校验、权限验证等。其中参数校验提供了HttpValidFilter
实现,大家可以参考来实现。这里是基于hibernate-validator实现的,大家可以替换成其他的。

3 http(client)
    通过HttpClient向服务器请求数据。做了优化处理,如果已经连接则直接请求,否则先连接。
    需要继承Handler来接收返回的数据,连接超时毫秒数CONNECT_TIMEOUT_MILLIS为默认的30000毫秒。

4 websocket
    通过HttpServer启动websocket服务器,该服务会自动扫描Action路径下的所有类进行注册,只不过
这里的Action需要实现接口WSockAction。websocket初始化时,由HttpClient发起Get请求,其中Headers
里面包含“Upgrade”=“websocket”的键值对。这时服务器需要启动握手流程,并且把从网络处理里面把
HttpHandler移除,加入新的WSockHandler。以后数据通信就由WSockHandler负责了。
    已经支持wss,通过HttpConf去配置。客户端通过wss访问时,不支持IP和端口,应该通过域名的形式来
访问。

5 tcp
    通过继承Server来启动服务器,继承Client来启动客户端。这里需要涉及到的配置参数由Manager.Conf
完成。每一个连接,都会实例化一个Handler来接收并处理数据。下面是tcp的接收和发送流程。
    Recv: Client -> Decode -> Handler -> Dispatcher -> Action
    Send: Handler -> Encode -> Client
    为了简便大家使用,提供了Protocol作为收发数据的基础实现,大家也可以仿照Protocol来实现其他的
通信数据框架。但是需要自己实现自己的编解码器(继承自Coder)、分发器(继承自Dispatcher)、自己的
处理器(继承自Handler)。当然业务逻辑处理的Action是必须的。

    为了大家使用方便,提供了MultiClient类,它可以维护多个客户端,分别去连接不同的服务器。如果
相应的服务器发生变化,可以通过方法updateClients去调整。但有一点需要记住的是:每一个客户端需要
有一个remoteId来做标识,所以建立连接的时候,需要主动调用MultiClient的registClient方法去设置
该Client的remoteId。

6 udp
    upd的实现流程跟tcp很类似。只不过服务器需要继承自UdpServer,客户端需要继承自UdpClient。
udp是无连接的,客户端发送数据总是向指定的IP和端口发送,服务器启动单线程监听端口并接收数据。
为了提高服务器处理性能,用RecvHandler来接收数据,并从对象池handlers里面获取一个UdpHandler来
处理数据。udp的处理器需要继承自UdpHandler,可以仿照ProtocolUdpHandler来写。
    注意:udp是无连接的,所以服务器发送数据只能原路返回。

BUG LIST
...

TODO LIST
1 扩展其他协议的支持
2 扩展TCP/UDP的加密算法

xnetter's People

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.