尽管Java官网有loom我的项目来实现协程,然而切实等不住了。既然fanx反对async/await,所以就尝试和异步IO联合,来实现高性能网络框架。

代码见这里:fanx-dev/fanxServer。

架构相似于netty的reactor模式,像这样:

示例代码:

class TestServer : Handler {  override async Void onService(Socket socket) {    buf := NioBuf.makeMem(1024)    n := await socket.read(buf, 1)    buf.flip()    echo("=====server receive: $buf: "+buf.readAllStr)    buf.clear    buf.printLine("HelloWorld")    buf.flip    n2 := await socket.write(buf)    echo("=====send: "+n2)  }  static Void main() {    Server {      port = 8080      handler = TestServer#    }.start  }}

代码中,当运行到await的时候当前任务暂停,并交给selector线程去监听IO事件,以后线程没有阻塞而是去持续解决其余连贯工作。当selector发现事件就绪后告诉复原运行工作。因为采纳线程池机制await前后可能运行在不同的线程中。

是不是代码看起来比netty的回调好多了。

反对根本的Http协定:

class HttpTestServer : HttpHandler {  override async Void onHttpService(HttpReq req, HttpRes res) {    echo("Server receive: "+req.headers)    res.headers["Content-Type"] = "text/html; charset=utf-8"    buf := NioBuf.makeMem(1024)    buf.printLine("<html>                        <body>Hello World</body>                       </html>")    buf.flip    //await res.writeFixed(buf)    await res.writeChunk(buf)  }  static Void main() {    Server {      port = 8080      handler = HttpTestServer#    }.start  }}

性能方面没有测试,预计必定比阻塞IO好。

Java基于协程的IO框架还能够应用kilim,本我的项目也参考了kilim的代码。