smart-socket 新版发布,一款面向未来的通信框架

科技资讯 投稿 18500 0 评论

1、smart-socket 简介

smart-socket,一款面向未来的 Java 通信框架。

smart-socket 新版发布,一款面向未来的通信框架

为什么要用「面向未来」来定义smart-socket?

因为好的技术不仅要解决现实问题,还需兼顾使用者的感受。促使人与技术更好的融合,以应对未来更复杂场景的挑战。

传统的 Java 通信框架在过去曾承担了非常重要的历史责任,但随着时间的推移变得越来越臃肿、复杂,尤其在性能和资源开销方面表现的不尽人意。产生的一系列新问题也在某种程度上阻碍了技术、以及技术人士的发展。甚至让从业人开始质疑 Java 语言是否只是依靠存量的生态维持着业务研发领域的繁荣,它不再合适应用于一些新兴领域。

smart-socket 自立项之初便以极简易用高性能为设计理念,力求打造出对开发人员友好,对硬件资源负责,能够拥抱未来更高性能要求、更高并发场景的开源作品。

  • 极简:于2017年开源至今发布了数十次版本,核心代码量始终控制在2500行以内,总代码量不足5000行。

  • 易用:5分钟上手(前提:未曾遭受网上错误编解码知识的毒害)

  • 高性能:以算法之力充分驱动硬件算力之势,基于smart-socket的服务在通信性能方面可轻松超过其他计算机语言开发的程序,包括且不限于:C/C++、Golang、Rust、Erlang。

模块介绍

模块说明代码量
aio-enhance采用 NIO 技术实现 Java AIO 接口规范900+
aio-core基于 aio-enhance 模块构建的高性能通信框架,引用此模块便可开展通信编程1400+
aio-pro在 aio-core 的基础上提供丰富的通信插件。非必要模块,可按需引用。2400+
benchmark实行百万级长连接测试的源码-
example各种示例程序-

2、 版本更新

背景一:

近几年 Java 的版本迭代尤为频繁,但对于我这个老 Javaer 来说 Java8 才是最经典实用的版本。高版本的新特性都是些不痛不痒的语法糖,毫无吸引力和诚意。所谓的GC性能优化,在垃圾业务代码面前都是弟弟。

我曾一度以为自己会长期当一个 Java8 钉子户,直到某一天在 Java 11 的源码中看到下面这段代码(Selector#select内部的一段方法)。

smart-socket 新版发布,一款面向未来的通信框架

在 Java 11 中 Selector 的 select 方法支持传入Consumer对象用以消费 SelectionKey 所感知的IO事件。省去了通过 HashSet 来收集、遍历、处理的过程,理论上会提升一部分通信性能。

public int select(Consumer<SelectionKey> action throws IOException {   return select(action, 0; }

所以,smart-socket 在 1.6.x 版本中开始尝试该特性,若效果显著算是给了一个升级JDK的理由。

背景二:

近期chatGPT的话题热度一直居高不下,正好前段时间用 smart-mqtt 做了个 IM,想着将 chatGPT 接入 IM 体验下人工智能。

技术选型自然是用自家研发的 smart-http 对接 chatGPT 的 openapi。然而过程中发现通过 SSL/TLS 发送的请求频繁出现超时现象。

作为一名资深的技术人,第一反应便是 chatGPT 的服务有问题;而饱经现实毒打磨炼出来的直觉提醒我:为什么用 curl 工具访问很稳定?

带着这个疑问挑灯夜战,历经数十次 debug 后总算找到了 smart-socket SSL插件中潜藏的小虫子。

本次更新内容

  1. 优化启动时控制台打印信息。

  2. 进一步缩小缓冲区的IO操作锁粒度。

  3. 重构 ssl/tls 代码,提升加密通信服务稳定性。

  4. 更新readme

  5. 改进 JDK11 环境下的通信处理模式。

Maven

<!-- JDK1.8 -->
<dependencies>
    <dependency>
        <groupId>org.smartboot.socket</groupId>
        <artifactId>aio-core</artifactId>
        <version>1.5.24</version>
    </dependency>
</dependencies>

<!-- JDK11 -->
<dependencies>
    <dependency>
        <groupId>org.smartboot.socket</groupId>
        <artifactId>aio-core</artifactId>
        <version>1.6.2</version>
    </dependency>
</dependencies>

3、快速上手

3.1 引入Maven依赖

<dependencies>
    <dependency>
        <groupId>org.smartboot.socket</groupId>
        <artifactId>aio-core</artifactId>
        <version>${version}</version>
    </dependency>
</dependencies>

3.2 定义协议

这里提供的示例是一种简单的字符串通信协议,仅作效果演示。实际场景中还需根据通信双方约定的协议实现编解码算法。

import org.smartboot.socket.Protocol;
import org.smartboot.socket.transport.AioSession;

import java.nio.ByteBuffer;

publicclass StringProtocol implements Protocol<String> {

    @Override
    public String decode(ByteBuffer readBuffer, AioSession session {
        int remaining = readBuffer.remaining(;
        if (remaining < Integer.BYTES {
            returnnull;
        }
        readBuffer.mark(;
        int length = readBuffer.getInt(;
        if (length > readBuffer.remaining( {
            readBuffer.reset(;
            returnnull;
        }
        byte[] b = newbyte[length];
        readBuffer.get(b;
        readBuffer.mark(;
        returnnew String(b;
    }
}

3.3 启动服务端

服务端通过System.out打印客户端传输过来的字符串内容,并将该内容原样传回至客户端。

import org.smartboot.socket.MessageProcessor;
import org.smartboot.socket.transport.AioQuickServer;
import org.smartboot.socket.transport.WriteBuffer;

import java.io.IOException;

publicclass StringServer {

    public static void main(String[] args throws IOException {
        MessageProcessor<String> processor = (session, msg -> {
            System.out.println("receive from client: " + msg;
            WriteBuffer outputStream = session.writeBuffer(;
            try {
                byte[] bytes = msg.getBytes(;
                outputStream.writeInt(bytes.length;
                outputStream.write(bytes;
            } catch (IOException e {
                e.printStackTrace(;
            }
        };

        AioQuickServer server = new AioQuickServer(8888, new StringProtocol(, processor;
        server.start(;
    }
}

try-catch中先后调用writeInt、write是一种协议编码手法,也是从事通信开发必须要理解和掌握的技能。

3.4 启动客户端

客户端与服务端建立TCP连接后,便向其发送hello smart-socket,当收到服务端的响应消息时,通过MessageProcessor的实现类进行控制台打印。

import org.smartboot.socket.MessageProcessor;
import org.smartboot.socket.transport.AioQuickClient;
import org.smartboot.socket.transport.AioSession;
import org.smartboot.socket.transport.WriteBuffer;

import java.io.IOException;

publicclass StringClient {

    public static void main(String[] args throws IOException {
        MessageProcessor<String> processor = (session, msg -> System.out.println("receive from server: " + msg;
        AioQuickClient client = new AioQuickClient("localhost", 8888, new StringProtocol(, processor;
        AioSession session = client.start(;
        WriteBuffer writeBuffer = session.writeBuffer(;
        byte[] data = "hello smart-socket".getBytes(;
        writeBuffer.writeInt(data.length;
        writeBuffer.write(data;
        writeBuffer.flush(;
    }
}

4、我们的用户

smart-socket 新版发布,一款面向未来的通信框架

篇幅有限,仅展示部分..。


5、关于组织

smartboot开源组织,一个容易被误认为是在“重复造轮子”的低调组织。曾获得 2020 年度 OSC 中国开源项目「优秀 Gitee 组织 」荣誉。

该组织内的明星项目包括:

  • smart-socket
    历时5年精炼出2千多行代码,轻松实现百万级长连接的 AIO 通信框架。

  • smart-http
    基于 smart-socket 实现的 HTTP/1.1 web服务。

  • smart-servlet
    基于 smart-http 实现的 Servlet 3.1 容器服务。

  • smart-broker
    基于 smart-socket 实现的 MQTT 3.1.1/5.0 Broker 服务。

  • smart-flow
    一款具备可观测性的轻量级业务编排框架。

组织地址:
代码仓库:https://gitee.com/smartboot

编程笔记 » smart-socket 新版发布,一款面向未来的通信框架

赞同 (28) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽