• Stars
    star
    140
  • Rank 252,545 (Top 6 %)
  • Language
    Kotlin
  • Created about 4 years ago
  • Updated 12 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

基于 Kotlin + Netty 开发,为 Android App 提供 Server 的功能,包括 Http、TCP、WebSocket 服务

AndroidServer

@Tony沈哲 on weibo License

基于 Kotlin + Netty 开发,为 Android App 提供 Server 的功能,包括 Http、TCP、WebSocket 服务

Feature:

  • 支持 Http、TCP、WebSocket 服务
  • 支持 Rest 风格的 API、文件上传、下载
  • 支持加载静态网页
  • Http 的路由表、全局的 HttpFilter 均采用字典树(Tried Tree)实现
  • 日志隔离,开发者可以使用自己的日志库
  • core 模块只依赖 netty-all,不依赖其他第三方库

最新版本

模块 最新版本
android-server-core
android-server-converter-gson

下载安装

将它添加到项目的 root build.gradle 中:

	allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}

Gradle:

implementation 'com.github.fengzhizi715.AndroidServer:core:<latest-version>'
implementation 'com.github.fengzhizi715.AndroidServer:gson:<latest-version>'

Usage:

搭建 Http 服务

AndroidServer 的 http 服务本身支持 rest 风格、支持跨域、cookies 等。

fun startHttpServer(context:Context, androidServer:AndroidServer) {

    androidServer
        .get("/hello") { _, response: Response ->
            response.setBodyText("hello world")
        }
        .get("/sayHi/{name}") { request, response: Response ->
            val name = request.param("name")
            response.setBodyText("hi $name!")
        }
        .post("/uploadLog") { request, response: Response ->
            val requestBody = request.content()
            response.setBodyText(requestBody)
        }
        .get("/downloadFile") { request, response: Response ->
            val fileName = "xxx.txt"
            File("/sdcard/$fileName").takeIf { it.exists() }?.let {
                response.sendFile(it.readBytes(),fileName,"application/octet-stream")
            }?: response.setBodyText("no file found")
        }
        .get("/test") { _, response: Response ->
            response.html(context,"test")
        }
        .fileUpload("/uploadFile") { request, response: Response -> // curl -v -F "file=@/Users/tony/1.png" 10.184.18.14:8080/uploadFile

            val uploadFile = request.file("file")
            val fileName = uploadFile.fileName
            val f = File("/sdcard/$fileName")
            val byteArray = uploadFile.content
            f.writeBytes(byteArray)

            response.setBodyText("upload success")
        }
        .filter("/sayHi/*", object : HttpFilter {
            override fun before(request: Request): Boolean {
                LogManager.d("HttpService","before....")
                return true
            }

            override fun after(request: Request, response: Response) {
                LogManager.d("HttpService","after....")
            }

        })
        .start()
}

测试:

curl -v 127.0.0.1:8080/hello
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /hello HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.50.1-DEV
> Accept: */*
>
< HTTP/1.1 200 OK
< server: monica
< content-type: text/plain
< content-length: 11
<
* Connection #0 to host 127.0.0.1 left intact
hello world
curl -v -d 测试 127.0.0.1:8080/uploadLog
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> POST /uploadLog HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.50.1-DEV
> Accept: */*
> Content-Length: 6
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 6 out of 6 bytes
< HTTP/1.1 200 OK
< server: monica
< content-type: text/plain
< content-length: 6
<
* Connection #0 to host 127.0.0.1 left intact
测试

搭建 WebSocket 服务

AndroidServer 支持提供 WebSocket 服务

fun startWebSocketServer(androidServer:AndroidServer) {
    androidServer
        .websocket("/ws",object : SocketListener<String>{
            override fun onMessageResponseServer(msg: String, ChannelId: String) {
                LogManager.d("WebSocketService","msg = $msg")
            }

            override fun onChannelConnect(channel: Channel) {
                val insocket = channel.remoteAddress() as InetSocketAddress
                val clientIP = insocket.address.hostAddress
                LogManager.d("WebSocketService","connect client: $clientIP")

            }

            override fun onChannelDisConnect(channel: Channel) {
                val ip = channel.remoteAddress().toString()
                LogManager.d("WebSocketService","disconnect client: $ip")
            }

        })
        .start()
}

测试:

curl -v \
     --include \
     --no-buffer \
     --header "Connection: Upgrade" \
     --header "Upgrade: websocket" \
     --header "Host: echo.websocket.org" \
     --header "Origin: https://echo.websocket.org" \
     --header "Sec-WebSocket-Key: NVwjmQUcWCenfWu98asDmg==" \
     --header "Sec-WebSocket-Version: 13" \
     http://127.0.0.1:8080/ws
GET /ws HTTP/1.1
Host: echo.websocket.org
User-Agent: curl/7.67.0
Accept: */*
Connection: Upgrade
Upgrade: websocket
Origin: https://echo.websocket.org
Sec-WebSocket-Key: NVwjmQUcWCenfWu98asDmg==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
upgrade: websocket
connection: upgrade
sec-websocket-accept: oPhRcOTYgRvrC0D+cTPcN3XYC1k=

Socket/WebSocket 服务可以使用 :https://github.com/fengzhizi715/NetDiagnose 进行测试。 上述 websocket 服务默认的 endpoint:ws://ip:port/ws

搭建 Socket 服务

AndroidServer 支持单独提供 Socket 服务,也支持一个端口同时提供 Socket/WebSocket 服务。

使用 androidServer 的 socketAndWS(),同时提供 Socket/WebSocket 服务:

fun startSocketServer(androidServer:AndroidServer) {
    androidServer
        .socketAndWS("/ws", object: SocketListener<String> {
            override fun onMessageResponseServer(msg: String, ChannelId: String) {
                LogManager.d("SocketService","msg = $msg")
            }

            override fun onChannelConnect(channel: Channel) {
                val insocket = channel.remoteAddress() as InetSocketAddress
                val clientIP = insocket.address.hostAddress
                LogManager.d("SocketService","connect client: $clientIP")

            }

            override fun onChannelDisConnect(channel: Channel) {
                val ip = channel.remoteAddress().toString()
                LogManager.d("SocketService","disconnect client: $ip")
            }

        })
        .start()
}

androidServer 的 socket() 单独提供 Socket 服务。

TODO List:

  • 提供默认的 TCP 服务
  • 支持 Https
  • 反向代理
  • 支持 HTTP/2

联系方式

Wechat:fengzhizi715

Java与Android技术栈:每周更新推送原创技术文章,欢迎扫描下方的公众号二维码并关注,期待与您的共同成长和进步。

ChangeLog

版本更新记录

License

Copyright (C) 2017 - present, Tony Shen.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

More Repositories

1

NetDiscovery

NetDiscovery 是一款基于 Vert.x、RxJava 2 等框架实现的通用爬虫框架/中间件。
Java
635
star
2

ProxyPool

给爬虫使用的代理IP池
Java
548
star
3

SAF

(Deprecated) SAF(Simple Android Framework)是一个简单的android框架,它为开发Android app提供了基础性组件。
Java
299
star
4

SAF-Kotlin-log

完全基于 Kotlin 开发的 Android 日志框架,提供极简的 API
Kotlin
269
star
5

SAF-AOP

android的AOP框架,支持android studio、gradle最新版本
Java
262
star
6

user-agent-list

常用浏览器的user-agent列表
Java
234
star
7

SAF-Kotlin-Utils

用 Kolin 做的 Android Utils 库,包括 utils 和 extension
Kotlin
187
star
8

AnalysisApp

一个快速分析某个app使用哪些sdk的小工具
Groovy
163
star
9

RxCache

A local reactive cache for Java and Android. Now, it supports heap memory、off-heap memory and disk cache.
Java
136
star
10

RxJavaInAction

《RxJava2.x 实战》一书中包含的例子。
Java
120
star
11

saf-logginginterceptor

Android项目中,OKHttp的日志的拦截器
Java
87
star
12

kotlin_tutorial

掘金的小册《Android 进阶:基于 Kotlin 的 Android App 开发实践》中的相关的例子
Kotlin
59
star
13

Tess-TwoDemo

Java
56
star
14

PicCrawler

使用RxJava2 和 Java 8的特性开发的图片爬虫
Java
55
star
15

Netty4Android

Kotlin + Netty 在 Android 上实现 Socket 的服务端 demo
Kotlin
53
star
16

Lifecycle-Coroutines-Extension

AAC 的 Lifecycle 结合 Kotlin Coroutines 进行使用
Kotlin
49
star
17

SAF-Object-Delegate

基于 Kotlin 的委托机制实现对 Extra、SharedPreferences 的封装。已经适配 AndroidX
Kotlin
46
star
18

TFLite-MnistDemo

Kotlin
46
star
19

adbd-connector

Kotlin
43
star
20

bytekit

Java 字节操作的工具库(不是字节码的工具库)
Java
39
star
21

EventBus

使用 Kotlin Coroutine 开发的 EventBus
Kotlin
39
star
22

RxCache4a

RxCache(https://github.com/fengzhizi715/RxCache) for Android
Java
35
star
23

okhttp-extension

okhttp-extension 是针对 okhttp 3 增强的网络框架。使用 Kotlin 特性编写,提供便捷的 DSL 方式创建网络请求,支持协程、响应式编程等等。
Kotlin
35
star
24

blockchain_study

Java
33
star
25

SAF-Kotlin-Router

android路由框架,支持模块化架构
Java
32
star
26

NetDiagnose

Android 网络诊断工具,使用 Kotlin + LiveData + MVVM + Coroutines 开发
Kotlin
26
star
27

KStateMachine

使用 Kotlin 特性实现的有限状态机 (FSM) 框架,基于事件驱动。
Kotlin
24
star
28

kotlin-spring-demo

Kotlin 整合 Spring Boot 2的例子
Kotlin
19
star
29

kvalidation

基于 Kotlin 特性实现的验证框架
Kotlin
17
star
30

LiveDataExtension

Kotlin
16
star
31

Kotlin-Coroutines-Utils

Kotlin Coroutines 的工具类库
Kotlin
16
star
32

RxJava-Utils

在日常开发实践中,本人所积累的 RxJava 相关的工具类
Kotlin
12
star
33

RxConditions

Java
11
star
34

SAF-Kotlin-InjectView

用Kotlin打造的简化版本的ButterKnife
Kotlin
8
star
35

okhttp-logging-interceptor

支持 Android、桌面、后端项目使用的 okhttp 日志拦截器
Kotlin
7
star
36

tony-common

个人java 后台项目中总结的常用类
Java
7
star
37

MLogCat

Java
6
star
38

kcommand

kcommand 是基于 Kotlin 特性实现的执行 Linux/Windows 命令的库
Kotlin
6
star
39

Advance-Kotlin-Tutorials

Kotlin
5
star
40

PubSub

使用 Kotlin Coroutines 实现的 Local Pub/Sub、Event Bus、Message Bus
Kotlin
5
star
41

kotlin-spring-reactive-coroutine-demo

Kotlin 使用 WebFlux、RxJava2 以及 coroutines 的例子
Kotlin
4
star
42

Vertxs

对Vert.x框架的封装
Java
3
star
43

FXHParser

抓取非小号数字货币
Java
2
star
44

NetDiscovery-Admin

Java
2
star
45

multi-level-cache

A multi-level cache framework implemented by RxCache(local cache) and Redis(remote cache).
1
star
46

websocket-demo

Kotlin
1
star
47

kjdbc

Kotlin
1
star
48

retrofit-SAF

saf 的 retrofit 框架,去掉gson和appengin以及okhttp依赖,使用saf中的fastjson和restclient替代
Java
1
star