展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Java实现HTTP长连接保活方法

Java实现HTTP长连接保活方法

在Java中实现HTTP长连接保活,核心在于配置连接池并辅以心跳机制。首先使用PoolingHttpClientConnectionManager管理连接池,设置最大连接数、空闲清理时间等参数,并通过后台线程定期清理过期和空闲连接;其次通过定时任务发送轻量级GET请求(如/ping)模拟活动流量,防止连接被服务器或中间件因空闲超时断开。此外还需合理设置连接存活时间、TCPKeep-Alive作为补充,并避免依赖Keep-Alive头部、错误配置连接池、不合理的心跳频率及接口设计等问题。最终结合异常处理、监

本文目录

    在Java中实现HTTP长连接保活,核心在于配置连接池并辅以心跳机制。首先使用PoolingHttpClientConnectionManager管理连接池,设置最大连接数、空闲清理时间等参数,并通过后台线程定期清理过期和空闲连接;其次通过定时任务发送轻量级GET请求(如/ping)模拟活动流量,防止连接被服务器或中间件因空闲超时断开。此外还需合理设置连接存活时间、TCP Keep-Alive作为补充,并避免依赖Keep-Alive头部、错误配置连接池、不合理的心跳频率及接口设计等问题。最终结合异常处理、监控与日志提升系统稳定性与问题排查能力。

    Java实现HTTP长连接的保活机制

    在Java中,要让HTTP长连接保持活跃,核心在于通过配置HTTP客户端库的连接池,并辅以周期性的“心跳”或探测请求来对抗服务器或网络中间件的空闲超时。这并非一个简单的开关,而是一个需要综合考虑连接管理、网络特性以及服务器行为的系统性工程。

    Java实现HTTP长连接的保活机制

    解决方案

    在Java里实现HTTP长连接的保活,我通常会选择成熟的HTTP客户端库,比如Apache HttpClient或OkHttp,它们提供了远超标准HttpURLConnection的控制能力。这里以Apache HttpClient为例,因为它在企业级应用中非常普遍。

    Java实现HTTP长连接的保活机制

    关键在于两点:一是连接池的管理,二是周期性的心跳探测。

    首先,你需要一个配置得当的连接管理器,它能帮你复用连接,避免频繁创建和销毁TCP连接的开销。PoolingHttpClientConnectionManager就是干这个的。

    Java实现HTTP长连接的保活机制
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.conn.HttpClientConnectionManager;
    import org.apache.http.conn.socket.ConnectionSocketFactory;
    import org.apache.http.conn.socket.PlainConnectionSocketFactory;
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.util.EntityUtils;
    import org.apache.http.HttpHost;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    
    public class HttpClientKeepAlive {
    
        private static PoolingHttpClientConnectionManager cm;
        private static CloseableHttpClient httpClient;
        private static ScheduledExecutorService scheduler;
    
        public static void initHttpClient() {
            // 注册HTTP和HTTPS连接工厂
            Registry socketFactoryRegistry = RegistryBuilder.create()
                    .register("http", PlainConnectionSocketFactory.INSTANCE)
                    .register("https", SSLConnectionSocketFactory.getSocketFactory())
                    .build();
    
            cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
            // 设置最大连接数
            cm.setMaxTotal(200);
            // 设置每个路由(即每个目标主机)的最大连接数
            cm.setDefaultMaxPerRoute(20);
            // 设置连接在池中存活的最长时间,超过这个时间会被关闭,即使它还在被使用
            // 但这里更重要的是下面的空闲连接清理
            cm.setConnectionTimeToLive(60, TimeUnit.SECONDS); // 这是一个硬性限制,慎用
    
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(5000) // 连接超时
                    .setSocketTimeout(10000) // 读取超时
                    .setConnectionRequestTimeout(5000) // 从连接池获取连接的超时时间
                    .build();
    
            httpClient = HttpClientBuilder.create()
                    .setConnectionManager(cm)
                    .setDefaultRequestConfig(requestConfig)
                    .build();
    
            // 启动一个后台线程来清理过期和空闲的连接
            scheduler = Executors.newSingleThreadScheduledExecutor();
            scheduler.scheduleAtFixedRate(() -> {
                // 关闭过期连接
                cm.closeExpiredConnections();
                // 关闭空闲超过指定时间的连接
                cm.closeIdleConnections(30, TimeUnit.SECONDS); // 30秒内没有活动的连接会被关闭
                System.out.println("清理连接池:过期连接和空闲超过30秒的连接已处理。");
            }, 0, 10, TimeUnit.SECONDS); // 每10秒执行一次清理
    
            // 启动心跳机制,假设我们有一个健康检查接口 /ping
            scheduler.scheduleAtFixedRate(() -> {
                try {
                    // 选择一个目标主机和路径进行心跳,比如访问一个轻量级的健康检查接口
                    // 确保这个接口响应迅速且不产生副作用
                    HttpHost targetHost = new HttpHost("your-api-host.com", 80); // 替换为你的实际API主机
                    HttpGet httpGet = new HttpGet("/ping"); // 替换为你的健康检查路径
    
                    // 尝试从连接池中获取一个连接并执行请求,这会刷新连接的活动时间
                    CloseableHttpResponse response = httpClient.execute(targetHost, httpGet);
                    try {
                        int statusCode = response.getStatusLine().getStatusCode();
                        if (statusCode == 200) {
                            // System.out.println("心跳成功,连接保持活跃。");
                        } else {
                            System.err.println("心跳请求返回非200状态码: " + statusCode);
                        }
                        EntityUtils.consume(response.getEntity()); // 确保响应体被完全消费
                    } finally {
                        response.close();
                    }
                } catch (Exception e) {
                    System.err.println("心跳请求失败: " + e.getMessage());
                    // 这里可以考虑更复杂的错误处理,比如重试或告警
                }
            }, 60, 60, TimeUnit.SECONDS); // 每60秒发送一次心跳
        }
    
        public static CloseableHttpClient getHttpClient() {
            return httpClient;
        }
    
        public static void shutdown() {
            try {
                if (scheduler != null) {
                    scheduler.shutdown();
                    scheduler.awaitTermination(5, TimeUnit.SECONDS);
                }
                if (httpClient != null) {
                    httpClient.close();
                }
                if (cm != null) {
                    cm.shutdown();
                }
            } catch (Exception e) {
                System.err.println("关闭HTTP客户端失败: " + e.getMessage());
            }
        }
    
        public static void main(String[] args) throws Exception {
            // 示例用法
            // 替换为你的实际API主机和端口
            // 假设你有一个简单的服务在本地8080端口
            // 并且有一个 /ping 接口
            // 或者你可以直接ping一个公共的、轻量级的API,如百度的首页
            // HttpHost targetHost = new HttpHost("www.baidu.com", 80);
            // HttpGet httpGet = new HttpGet("/");
    
            // 这里为了演示心跳机制,我们用一个占位符,实际使用时请替换
            // 确保你的服务有一个轻量级的健康检查接口
            // 如果没有,可以考虑ping一个静态资源或者一个非常简单的API
            // 但要注意,心跳的目的是刷新连接活跃度,而不是频繁地执行业务逻辑
    
            initHttpClient();
    
            // 模拟业务请求,使用长连接
            for (int i = 0; i < 5; i++) {
                try (CloseableHttpResponse response = httpClient.execute(new HttpGet("http://your-api-host.com/some-data"))) {
                    System.out.println("业务请求 " + i + " 状态码: " + response.getStatusLine().getStatusCode());
                    EntityUtils.consume(response.getEntity());
                } catch (Exception e) {
                    System.err.println("业务请求 " + i + " 失败: " + e.getMessage());
                }
                Thread.sleep(5000); // 间隔5秒
            }
    
            // 保持主线程运行一段时间,观察心跳效果
            System.out.println("等待心跳机制运行...");
            Thread.sleep(180 * 1000); // 等待3分钟
    
            shutdown();
            System.out.println("客户端已关闭。");
        }
    }

    这段代码的核心是PoolingHttpClientConnectionManager,它负责管理连接的生命周期。closeIdleConnections方法尤其重要,它会关闭那些在指定时间内没有被使用的连接。而周期性的HttpGet("/ping")操作,则是在连接空闲时,主动发送一个轻量级请求,让连接“动起来”,从而避免被服务器或中间件因为空闲而断开。

    为什么HTTP长连接需要保活?理解其核心挑战

    在我个人经历中,处理HTTP长连接的保活问题,往往比想象中要复杂。很多时候,我们以为配置了Connection: Keep-Alive头,连接就能一直活下去,但现实总会给你泼冷水。我个人在处理一些老旧系统集成时,就经常碰到连接被莫名其妙断开的问题,后来才发现很多时候就是中间件搞的鬼。

    核心挑战主要来自几个方面:

    1. 服务器端超时(Server-Side Timeouts):绝大多数Web服务器(如Nginx、Apache HTTP Server、Tomcat)以及应用服务器都会配置一个HTTP连接的空闲超时时间。如果一个连接在设定的时间内没有任何数据传输,服务器就会主动关闭它,以释放资源。这完全是服务器的“自保”行为。
    2. 网络中间件的干预(Network Intermediary Interference):这是最隐蔽也最让人头疼的。负载均衡器、防火墙、NAT设备、代理服务器等网络中间件,它们为了节省资源或维护状态,也可能对长时间空闲的TCP连接进行清理。这些设备通常不会通知客户端或服务器,连接就这么“悄无声息”地断了。当你再次尝试使用这个连接时,就会遇到Connection Reset by Peer或SocketTimeoutException。
    3. 资源管理(Resource Management):无论是客户端还是服务器,维持一个打开的TCP连接都需要消耗一定的内存和文件描述符。如果任由连接无限期地保持,可能会导致资源耗尽。因此,合理的超时和保活机制是必要的,它平衡了性能和资源利用。
    4. HTTP/1.1的“Keep-Alive”是建议而非保证:Connection: Keep-Alive只是客户端向服务器发出的一个请求,表示希望保持连接。服务器可以接受,也可以拒绝。即使服务器接受了,也无法保证连接不会被网络中间件或服务器自身的空闲策略关闭。

    所以,仅仅依赖HTTP协议本身的Keep-Alive机制是不够的,我们需要在应用层面主动出击,确保连接的“活力”。

    Java中实现HTTP长连接保活的几种策略与实践

    在Java生态里,实现HTTP长连接的保活,我们通常会组合使用几种策略。没有银弹,只有最适合你场景的组合拳。

    1. 精心配置连接池:这是基础,也是最容易被忽视的。

      • 最大连接数 (MaxTotal) 和每路由最大连接数 (DefaultMaxPerRoute):这是为了控制连接池的规模,防止连接数过多耗尽资源,或者过少导致频繁创建连接。我通常会根据压测结果和服务器承载能力来调整。
      • 连接空闲清理 (closeIdleConnections):这是关键!Apache HttpClient的PoolingHttpClientConnectionManager提供了closeIdleConnections(long idleTimeout, TimeUnit unit)方法。你需要一个独立的线程(就像我上面代码里用ScheduledExecutorService做的)周期性地调用这个方法,清理那些在指定时间内没有被使用的连接。这能有效防止连接在池子里“僵死”,同时也能释放长期不用的资源。
      • 连接存活时间 (setConnectionTimeToLive):这个参数设置的是连接在池中存活的最长时间。即使连接一直在被使用,超过这个时间也会被关闭。这对于应对一些网络中间件的硬性超时(比如每小时强制断开)非常有效,可以避免连接过老导致的问题。但我个人倾向于先通过心跳和空闲清理来管理,这个参数作为最后的兜底。
    2. 应用层心跳机制(Heartbeat/Ping):这是真正的“保活”手段。

      • 原理:通过一个独立的定时任务,周期性地向目标服务器发送一个非常轻量级的HTTP请求(比如一个GET /health或OPTIONS /),来模拟连接的活动。只要连接有数据传输,它在服务器和网络中间件那里的空闲计时器就会被重置。
      • 选择合适的“心跳”路径:这个路径必须是服务器上一个响应迅速、不涉及复杂业务逻辑、且没有副作用的接口。例如,一个健康检查接口,或者一个返回固定小文本的静态文件。避免用业务接口做心跳,那可能会带来不必要的负载。
      • 心跳频率:这是一个需要权衡的参数。
        • 太频繁:会增加网络流量和服务器负载,甚至可能被误认为是DDoS攻击。
        • 太稀疏:可能在心跳间隔期间连接就被断开了。
        • 经验法则:通常设置为服务器空闲超时时间的一半或三分之二。例如,如果服务器超时是60秒,你可以设置为30-40秒发送一次心跳。我一般会从一个相对保守的值开始(比如30秒),然后根据实际监控和日志来调整。
      • 实现方式:就像我在解决方案里展示的,使用ScheduledExecutorService配合httpClient.execute(HttpGet)来完成。
    3. TCP Keep-Alive选项(SO_KEEPALIVE):这是操作系统层面的TCP协议特性。

      • 原理:当TCP连接开启SO_KEEPALIVE选项后,操作系统会在连接空闲一段时间后,自动发送一个探测包给对端。如果对端有响应,说明连接依然活跃;如果没有响应,会重试几次,最终判断连接已断开。
      • Java中的设置:可以通过Socket.setKeepAlive(true)来设置。在Apache HttpClient中,可以通过RegistryBuilder配置PlainConnectionSocketFactory或SSLConnectionSocketFactory时,传入自定义的SocketConfig来设置。
      • 局限性:TCP Keep-Alive的探测间隔通常非常长(默认可能几分钟到几小时),且探测包不带任何应用层数据。这意味着它可能无法及时发现HTTP层面的超时(服务器HTTP超时通常是几十秒),也无法穿透一些只检查应用层流量的防火墙或代理。所以,它通常作为应用层心跳的补充,而非替代。

    实际应用中,我发现“连接池的空闲清理”加上“应用层心跳”是应对HTTP长连接保活最有效且可控的组合。

    避免踩坑:HTTP长连接保活中的常见误区与优化建议

    在实现HTTP长连接保活的过程中,我踩过不少坑,也总结了一些经验。避免这些常见的误区,能让你少走很多弯路。

    1. 误区一:盲目依赖Connection: Keep-Alive头部

      • 问题:很多人以为只要请求头里带了这个,连接就万事大吉了。实际上,这只是一个协商,服务器和中间件都有权无视或在特定条件下断开。
      • 建议:永远不要只依赖这个头部。它是一个好习惯,但不是保活的充分条件。
    2. 误区二:不配置或错误配置连接池

      • 问题:要么不用连接池,导致每次请求都新建连接,性能极差;要么连接池配置不当,比如MaxTotal太小导致连接饥饿,或者没有开启空闲连接清理,导致连接池里堆积大量“僵尸”连接。
      • 建议:
        • 务必使用连接池,并根据压测结果和系统资源来合理设置MaxTotal和DefaultMaxPerRoute。
        • 核心中的核心:一定要启动一个独立的线程,周期性地调用connectionManager.closeIdleConnections(timeout, unit)。这是清理连接池中实际已失效或长时间空闲连接的关键。很多连接问题都是因为连接池里充满了看似可用实则已断的连接。
    3. 误区三:心跳频率设置不合理

      • 问题:心跳太频繁,增加不必要的网络和服务器负载;心跳太稀疏,起不到保活作用,连接依然会被断开。
      • 建议:
        • 观察服务器超时时间:了解你所连接的Web服务器、负载均衡器、防火墙等的空闲超时配置。将心跳间隔设为这些超时时间中最小值的一半或三分之二。例如,如果服务器超时是60秒,负载均衡器超时是30秒,那么你的心跳间隔应该小于15秒。
        • 监控:通过监控连接池的活跃连接数、错误日志(特别是Connection Reset、SocketTimeout)来判断心跳是否有效,并进行微调。
    4. 误区四:心跳接口设计不当

      • 问题:用一个复杂的业务接口做心跳,导致每次心跳都占用大量计算资源;或者心跳接口本身不稳定,反而引入新的错误。
      • 建议:心跳接口必须是轻量级、无副作用、响应快速的。最好是专门设计的健康检查接口,或者一个简单的静态资源。
    5. 误区五:忽视异常处理和重试机制

      • 问题:即使做了保活,网络波动、服务器重启等仍可能导致连接断开。如果代码没有健壮的异常处理和重试机制,一次连接失败就可能导致整个请求失败。
      • 建议:
        • 对HTTP请求(包括心跳请求)进行适当的异常捕获。
        • 对于可重试的错误(如连接超时、连接被重置),考虑实现指数退避或固定间隔的重试策略。
        • 引入熔断器(Circuit Breaker)模式,防止对故障服务的持续请求导致资源耗尽。
    6. 优化建议:监控与日志

      • 日志:在连接池清理和心跳执行时打印必要的日志,例如清理了多少连接,心跳是否成功等,这对于排查问题至关重要。
      • 监控:集成Metrics库(如Micrometer或Prometheus Client)来监控连接池的各项指标,如活跃连接数、空闲连接数、等待连接的队列长度、连接创建/关闭速率等。这些数据能直观地反映连接池的健康状况和保活机制的效果。

    总而言之,HTTP长连接

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。