如何用Java+WebSocket实现实时文档协作?3种主流方案对比与选型建议

第一章:实时文档协作系统概述

实时文档协作系统是现代分布式团队高效协同工作的核心技术之一,允许多名用户在同一文档上同时编辑、查看和评论,所有更改即时同步,确保信息一致性与协作流畅性。这类系统广泛应用于在线办公、代码协作、项目管理等场景,典型代表包括 Google Docs、Notion 和腾讯文档。

核心特性

  • 实时同步:用户输入内容后,系统通过WebSocket或长连接将变更推送至其他客户端
  • 冲突解决:采用操作转换(OT)或CRDT(无冲突复制数据类型)算法处理并发编辑
  • 历史版本控制:支持时间轴回溯,可查看并恢复任意历史状态
  • 权限管理:细粒度控制用户访问与编辑权限,保障数据安全

技术架构简述

典型的实时协作系统由前端编辑器、通信层、协同服务引擎与存储层构成。前端常基于 ContentEditable 或 Slate.js 等富文本框架;通信层使用 WebSocket 实现双向实时通信;协同逻辑层负责 OT/CRDT 运算;持久化层则依赖数据库保存文档快照与操作日志。
// 示例:WebSocket 消息处理伪代码
func handleEditMessage(conn *websocket.Conn, msg []byte) {
    var op Operation
    json.Unmarshal(msg, &op)
    
    // 应用操作转换算法合并变更
    transformedOp := otServer.Transform(op)
    
    // 广播给其他客户端
    broadcast(transformedOp)
    
    // 持久化操作日志
    store.AppendOperation(transformedOp)
}

数据一致性模型对比

模型原理优点缺点
OT操作转换,调整操作执行顺序成熟稳定,Google Docs 使用实现复杂,需定义大量转换规则
CRDT无冲突数据结构,天然支持并发无需中心协调,扩展性强内存开销大,调试困难
graph TD A[客户端A] -- WebSocket --> C[协同服务] B[客户端B] -- WebSocket --> C C --> D[(文档存储)] C --> E[OT/CRDT 引擎] E --> C

第二章:WebSocket基础与Java集成实现

2.1 WebSocket协议原理与Java支持机制

WebSocket是一种基于TCP的全双工通信协议,允许客户端与服务器之间建立持久化连接,实现低延迟的数据交互。与HTTP的请求-响应模式不同,WebSocket在握手完成后,双方可独立发送数据帧。
握手过程与帧结构
初始连接通过HTTP升级请求完成,服务端响应状态码101表示协议切换成功。后续通信以帧(Frame)为单位,包含操作码、掩码和负载数据。
Java中的WebSocket支持
Java平台通过JSR 356标准提供原生支持,主流框架如Spring Boot封装了简易API:

@ServerEndpoint("/ws")
public class WebSocketEndpoint {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("New connection: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        session.getAsyncRemote().sendText("Echo: " + message);
    }
}
上述代码定义了一个WebSocket端点,@OnOpen 在连接建立时触发,@OnMessage 处理客户端消息,Session 对象用于管理会话和异步消息发送。

2.2 使用Spring WebSocket搭建通信骨架

在构建实时Web应用时,Spring WebSocket提供了完整的消息通信支持。通过配置WebSocketConfig类并实现WebSocketConfigurer接口,可注册自定义的处理器和路径映射。
配置WebSocket入口
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myHandler(), "/ws/connect")
                .setAllowedOrigins("*");
    }

    @Bean
    public WebSocketHandler myHandler() {
        return new MyWebSocketHandler();
    }
}
上述代码注册了WebSocket处理器,并开放/ws/connect为通信端点,setAllowedOrigins("*")允许跨域连接,适用于开发环境。
消息处理流程
  • 客户端通过new WebSocket("ws://localhost:8080/ws/connect")建立连接
  • 服务端MyWebSocketHandler接收OPEN、MESSAGE、CLOSE事件
  • 通过WebSocketSession实现双向数据推送

2.3 用户会话管理与连接生命周期控制

用户会话管理是保障系统安全与资源高效利用的核心机制。通过维护用户状态并精确控制连接的建立、维持与释放,系统可在高并发场景下保持稳定。
会话创建与令牌机制
用户登录后,服务端生成唯一会话令牌(Session Token),通常以 JWT 形式返回:
// 生成JWT示例
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
    "user_id": 123,
    "exp":     time.Now().Add(2 * time.Hour).Unix(),
})
signedToken, _ := token.SignedString([]byte("secret-key"))
该代码生成一个2小时后过期的签名令牌,exp 字段确保自动失效,降低长期会话风险。
连接生命周期策略
系统采用分级策略管理连接存活:
  • 空闲超时:TCP连接空闲超过60秒则关闭
  • 心跳保活:客户端每30秒发送一次ping请求
  • 异常终止:检测到非法数据包立即断开

2.4 消息编解码设计与自定义数据格式

在分布式系统中,高效的消息编解码机制是保障通信性能的关键。为提升序列化效率并降低网络开销,常采用自定义二进制数据格式替代通用协议。
数据格式设计原则
自定义格式需兼顾可读性、扩展性与紧凑性。典型结构包括:魔数(Magic Number)、版本号、消息类型、长度字段与负载数据。
字段长度(字节)说明
Magic Number4标识协议合法性
Version1支持协议迭代
MessageType1区分请求/响应等类型
Length4负载长度,用于粘包处理
Payload变长实际传输数据
编码实现示例
type Message struct {
    MagicNumber uint32
    Version     byte
    MessageType byte
    Length      uint32
    Payload     []byte
}

func (m *Message) Encode() []byte {
    buf := make([]byte, 10+len(m.Payload))
    binary.BigEndian.PutUint32(buf[0:4], m.MagicNumber)
    buf[4] = m.Version
    buf[5] = m.MessageType
    binary.BigEndian.PutUint32(buf[6:10], m.Length)
    copy(buf[10:], m.Payload)
    return buf
}
上述代码将消息结构体序列化为预定义的二进制格式,使用大端序确保跨平台一致性。各字段按顺序写入缓冲区,便于接收方解析。

2.5 心跳机制与异常断线重连实践

在长连接通信中,心跳机制是保障连接活性的关键手段。通过周期性发送轻量级探测包,可及时发现网络中断或服务不可达状态。
心跳设计要点
  • 心跳间隔需权衡实时性与资源消耗,通常设置为30秒
  • 连续多次失败后触发重连逻辑,避免短暂抖动导致频繁重建
Go语言实现示例
ticker := time.NewTicker(30 * time.Second)
defer ticker.Stop()

for {
    select {
    case <-ticker.C:
        if err := conn.WriteJSON(&Ping{Type: "ping"}); err != nil {
            log.Println("心跳失败:", err)
            reconnect() // 触发重连
            return
        }
    }
}
上述代码使用time.Ticker每30秒发送一次ping消息。若写入失败,说明连接异常,立即进入重连流程。
重连策略对比
策略特点适用场景
立即重试快速恢复,易造成雪崩内部可信网络
指数退避缓解服务器压力公网不稳定环境

第三章:主流协作同步模型解析

3.1 OT(操作变换)算法核心思想与Java实现

操作变换的基本原理
OT算法是实现实时协同编辑的核心技术,其关键在于当多个用户并发编辑同一文档时,通过变换函数调整操作的执行顺序,确保最终状态一致。每个编辑操作如插入、删除字符,都被抽象为包含位置、内容和类型的操作对象。
Java中的基础实现

public class OTOperation {
    int position;
    String text;
    boolean isInsert;

    public OTOperation transform(OTOperation other) {
        if (this.position < other.position || 
            (this.isInsert && this.position == other.position)) {
            return new OTOperation(this.position, this.text, this.isInsert);
        }
        int offset = other.isInsert ? other.text.length() : -other.text.length();
        return new OTOperation(this.position + offset, this.text, this.isInsert);
    }
}
上述代码展示了操作变换的核心逻辑:当两个操作作用于同一文本时,需根据对方操作的位置和类型调整自身位置。若当前操作位置在前,或为插入且位置相等,则不受影响;否则根据对方插入或删除的字符长度进行偏移修正。

3.2 CRDT(无冲突复制数据类型)在文本协同中的应用

数据同步机制
CRDT 通过数学原理保证多副本并发修改的最终一致性,无需中心协调。在文本协同编辑中,每个字符操作被转化为可交换、可结合的操作函数。
  • 基于状态的 CRDT:客户端定期交换完整状态
  • 基于操作的 CRDT:仅广播原子操作,效率更高
常见实现模型
类型优点缺点
OT (Operational Transform)逻辑灵活复杂度高
Yjs / Automerge自动合并、低延迟内存占用较高

// 示例:插入字符的 CRDT 操作
function insertChar(siteId, index, char) {
  const timestamp = Date.now();
  const uniqueId = `${siteId}-${timestamp}`;
  return { type: 'insert', id: uniqueId, index, char };
}
该函数生成带唯一标识的操作,确保不同客户端插入相同位置时仍可排序合并,利用全序关系解决冲突。

3.3 基于Lamport时间戳的简单冲突解决策略

在分布式系统中,多个节点可能同时修改同一数据项,引发写冲突。Lamport时间戳通过为每个操作分配全局逻辑时间戳,提供了一种轻量级的冲突解决机制。
时间戳生成与比较
每个节点维护本地逻辑时钟,每次发生事件时递增。写操作携带其时间戳,格式如下:
type Timestamp struct {
    Clock int64 // 逻辑时钟值
    NodeID int   // 节点唯一标识
}
当两个写操作冲突时,系统优先采用时间戳更大的操作。若时钟值相同,则通过NodeID确保全序。
冲突解决流程
  • 接收写请求时,附加当前Lamport时间戳
  • 在数据合并阶段,按时间戳降序排序操作
  • 保留最大时间戳对应的数据版本
该策略实现简单、开销低,适用于最终一致性场景。

第四章:典型架构方案对比与实战集成

4.1 方案一:Spring Boot + WebSocket + OT算法协同编辑

该方案采用 Spring Boot 构建后端服务,结合 WebSocket 实现双向实时通信,并引入 OT(Operational Transformation)算法解决多用户并发编辑冲突。
数据同步机制
通过 WebSocket 建立持久连接,客户端每次输入操作以操作指令(如插入、删除)形式发送至服务端。服务端利用 OT 算法对操作进行变换与合并,确保最终一致性。

@ServerEndpoint("/edit/{docId}")
public class CollaborativeEditingSocket {
    
    @OnMessage
    public void onMessage(String message, Session session) {
        Operation op = parseOperation(message);
        Operation transformed = otService.transform(op); // OT 变换
        broadcast(transformed); // 广播给其他客户端
    }
}
上述代码定义了一个 WebSocket 端点,接收编辑操作,经 OT 变换后广播,实现多端同步。
核心优势
  • 实时性强:WebSocket 提供低延迟双向通信
  • 一致性保障:OT 算法解决并发冲突,维护文档一致性
  • 易于扩展:Spring Boot 生态支持微服务化部署

4.2 方案二:使用ShareDB实现后端协同逻辑

ShareDB 是一个基于 OT(Operational Transformation)算法的实时数据同步库,专为构建协同编辑应用设计。它通过 WebSocket 实现客户端与服务端的双向通信,确保多个用户对同一文档的操作能实时、一致地同步。
数据同步机制
ShareDB 将文档抽象为 JSON 对象,所有变更以“操作”(op)的形式提交。每个操作包含路径、类型和值,服务端负责合并冲突并广播更新。

const backend = new ShareDB();
const connection = backend.connect();

const doc = connection.get('documents', 'doc1');
doc.subscribe((err) => {
  if (err) throw err;
  console.log('Initial data:', doc.data);
});

// 监听远程变更
doc.on('op', (op, source) => {
  if (source) return; // 忽略本地发起的变更
  console.log('Remote operation:', op);
});
上述代码展示了客户端订阅文档并监听操作变更的过程。`subscribe` 方法加载初始数据,`op` 事件在收到其他客户端的修改时触发,实现低延迟同步。
优势与适用场景
  • 内置 OT 算法,开箱即用的协同能力
  • 支持 MongoDB、Redis 等后端存储扩展
  • 适用于富文本编辑器、实时表单等高交互场景

4.3 方案三:集成Yjs构建高性能CRDT协作系统

CRDT与实时协作原理
Yjs 是基于 CRDT(冲突-free Replicated Data Type)的前端协作库,能够在分布式环境下实现无冲突的数据同步。其核心优势在于支持离线编辑与最终一致性,适用于文档协同、白板等高并发场景。
集成Yjs的基本流程
通过 WebSocket 与 Yjs 结合,可快速搭建实时协作系统。以下为初始化共享文档的代码示例:

// 初始化 Yjs 文档实例
const ydoc = new Y.Doc();
// 创建共享的文本类型
const yText = ydoc.getText('shared-text');

// 监听本地变更并同步
yText.observe(event => {
  console.log('文本变更:', event);
});

// 通过 WebRTC 或 WebSocket 进行数据交换
const provider = new WebrtcProvider('room-name', ydoc);
上述代码中,Y.Doc() 创建全局文档,getText 获取可协作的文本类型,observe 监听变更,WebrtcProvider 实现点对点同步,降低服务器压力。
性能对比优势
  • 无需中心协调:所有节点平等,支持离线操作
  • 低延迟响应:本地优先更新,自动合并冲突
  • 可扩展性强:支持多种数据类型(Map、Array、Text)

4.4 性能压测与多客户端同步一致性验证

在高并发场景下,系统需同时保障高性能与数据一致性。为此,采用分布式压测框架模拟多客户端并发访问,验证服务端响应能力及数据同步准确性。
压测方案设计
使用 ghz 工具对 gRPC 接口进行压力测试,配置如下:

{
  "total": 10000,
  "concurrent": 100,
  "proto": "service.proto",
  "call": "UserService.GetUser"
}
参数说明:发起 10,000 次请求,100 并发连接,评估吞吐量与 P99 延迟。
一致性验证机制
通过写入-读取比对策略,确保多客户端间数据视图一致。核心逻辑如下:

for _, client := range clients {
    go func(c *UserClient) {
        resp, _ := c.Get(ctx, &GetRequest{ID: "user-123"})
        if resp.Version != expectedVersion {
            log.Printf("Consistency mismatch: got %d, want %d", resp.Version, expectedVersion)
        }
    }(client)
}
该段代码启动多个协程,模拟不同客户端并行读取同一资源,校验版本号是否一致。
关键指标对比
并发数平均延迟(ms)错误率(%)一致性达成率(%)
5012.40.0100
20038.70.199.6

第五章:选型建议与未来扩展方向

技术栈选型的实战考量
在微服务架构中,选择合适的通信协议至关重要。gRPC 因其高性能和强类型契约,在内部服务间调用中表现优异。以下是一个典型的 Go 语言 gRPC 客户端初始化代码片段:

conn, err := grpc.Dial("service.example:50051", 
    grpc.WithInsecure(),
    grpc.WithTimeout(5*time.Second),
)
if err != nil {
    log.Fatal("无法连接到gRPC服务: ", err)
}
client := pb.NewUserServiceClient(conn)
相比 REST+JSON,gRPC 在吞吐量敏感场景下可提升 30% 以上性能。
可扩展性设计模式
为支持未来业务增长,推荐采用事件驱动架构解耦核心模块。通过消息队列实现异步处理,能有效应对突发流量。以下是常见中间件对比:
中间件吞吐量 (msg/s)持久化支持典型应用场景
Kafka百万级是日志聚合、事件溯源
RabbitMQ十万级可配置任务调度、通知分发
云原生环境下的演进路径
服务网格(如 Istio)可为现有系统提供零侵入的可观测性与流量治理能力。部署时建议分阶段推进:
  • 第一阶段:在非核心服务中启用 sidecar 注入
  • 第二阶段:配置金丝雀发布策略,验证流量镜像功能
  • 第三阶段:集成 OpenTelemetry 实现全链路追踪
某电商平台在引入 Istio 后,故障定位时间从平均 45 分钟缩短至 8 分钟。

相关推荐

从零到一:构建基于Java的Office文档在线协作平台的技术选型与实战

本文详细介绍了如何从零构建基于Java的Office文档在线协作平台,涵盖技术选型、架构设计及实战经验。重点解析了Word、Excel、PPT等文档的在线预览编辑技术,以及实时协作、安全合规等企业级需求解决方案,为开发者提供全面的技术参考。

weixin_29015801的博客 452

【java集成onlyoffice实现多人在线编辑的介绍和代码实现】

可以使用OnlyOffice提供的JavaScript API来实现,在前端页面中插入一个iframe元素,并将OnlyOffice编辑器嵌入到iframe中。当用户访问前端页面时,会向后端发送一个请求来创建一个OnlyOffice文档,然后将文档加载到前端页面中的iframe元素中。首先,需要搭建一个OnlyOffice服务器,可以使用Docker部署OnlyOffice服务器。创建一个Controller类,用于接收前端的请求,并将请求转发给OnlyOffice服务器。步骤三:前端页面代码实现。

qq_43759721的博客 5022

基于SpringBoot 3 + Vue 3 + WebSocket的简易在线协作办公套件系统设计与实现

在当今快节奏的工作环境中,团队成员之间的高效协作是项目成功的关键。.requestMatchers("/api/auth/**", "/ws/**").permitAll() // 认证和WebSocket端点放行。| - 状态管理(Pinia) | <-------------------------------> | - 数据访问层(Repository)|// 设置应用程序目的地的前缀为"/app",所有目的地以"/app"开头的消息都会被路由到@MessageMapping注解的方法。

2201_76125393的博客 338

javaweb 实现在线编辑Word

在线编辑 Word 文档是指使用 JavaWeb 应用程序提供的 web 界面,在浏览器中直接对 Word 文档进行编辑。 要实现在线编辑 Word 文档,需要使用一些特定的技术和工具。常用的技术包括: Microsoft Office Online API:这是一个云服务,可以在浏览器中直接编辑 Word 文档。 Apache POI:这是一个 Java 库,可以用来处理 Microsoft...

weixin_35756624的博客 2714

sharedb:基于操作转换(OT)的实时数据库后端

该自述文件适用于sharedb@1.x 。 有关sharedb@1.x-beta ,请参见。 要升级,请参阅。 共享数据库 ShareDB是基于JSON文档的的实时数据库后端。 它是的实时后端。 如有疑问,讨论和公告,请加入或 。 请将发现的所有错误报告给。 特征 实时同步任何JSON文档 并发多用户协作 具有异步最终一致性的同步编辑API 实时查询订阅 与任何数据库轻松集成 , (实验性) 通过可水平扩展 从文档和操作中选择所需字段的投影 用于实现访问控制和自定义扩展的中间件 非常适合在浏览器或服务器上使用 重新连接后脱机更改同步 用于单元测试的数据库和pub / sub的内存中实现 重新连线 TLDR const WebSocket = require ( &#39;reconnecting-websocket&#39; ) ; var socket = new WebSocket (

调试备忘录-SWD协议解析

目录--点击可快速直达 文章目录写在前面1  SWD协议简介2  SWD物理层协议解析2.1  SWD通信时序分析2.2  SWD 寄存器简介2.2.1  DP寄存器2.2.2  AP寄存器2.3  SWD通信流程2.3.1  SWD复位2.3.2  SWD读IDCODE2.3.3  SWD清除错误标志位,并且使能AP调试2.3.4  SWD读取AP IDR(也就是AP寄存器的ID CODE)2.3.5  SWD读写MCU任意寄存器 写在前面 最近由于公司需要,所以就做了个基于SWD协议的离线烧写器。由于.

洛神殇的博客 1万+

【Java】多人协同在线编辑Excel源代码及部署包

1. 背景 在互联网环境中,我们可以使用 腾讯云文档、金山云文档等在线编辑Excel,但内网环境下却一直没有类似的工具,直到开源项目 LuckySheet 横空出世! 以下就是基于 LuckySheet 的一个前后端集成的,可以实际运行的 Demo。可以直接部署在内网使用。 话不多说。具体见:我的Gitee项目。该项目直接 fork 自开源项目 ecsheet ,我修正了几个错误。 2. 下载 下面附上我编译好的可运行 jar。 3. 使用 3.1 运行环境 该jar使用 mongo

huanqing2010的专栏 1万+

Unity坦克物理系统:履带驱动与力场建模实战指南

在游戏物理仿真中,履带车辆的运动建模远超传统轮式控制器的范畴。其核心在于摒弃WheelCollider的滚动幻觉,转向基于牛顿力学的力与力矩协同求解——通过主推进力场、转向力矩场和地面反作用力场三重叠加,实现对质量、摩擦、惯性及坡度阻力的真实响应。这种建模方式不仅支撑坦克爬坡、陷泥、侧倾等复杂行为,更保障了多人同步与高帧率下的物理稳定性。Physics Tank Maker 正是这一思路的工业级落地,它将PhysX底层机制与坦克动力学深度耦合,提供可调参数、事件驱动视觉反馈及标准扩展接口,成为面向严肃模拟类

weixin_29535577的博客 562

Java实现在线编辑预览office文档

PageOffice是一款在线的office编辑软件,帮助Web应用系统或Web网站实现用户在线编辑文档。可以完美实现在线公文流转,领导批阅,盖章。可以给文件添加水印,在线安全预览防止用户下载和复制文件等我们对以上找到的优秀的解决方案,进行改进和总结,并封装成一个组件:preview组件为什么是组件?因为它跟框架无关,可以在任何框架中使用,且使用起来跟原生的div标签一样方便。并编写使用文档: preview组件文档, 文档支持交互体验。目前docx,pdf,xlsx预览基本可以了,都是最好的方案。

上善若泪 5891

手把手教你用Apollo Dreamview调试自动驾驶感知模块(附数据包下载)

本文详细介绍了如何使用百度Apollo平台的Dreamview工具调试自动驾驶感知模块,包括环境配置、数据加载、感知问题定位和多传感器融合调试等关键步骤。通过实战案例和参数调整技巧,帮助开发者快速掌握自动驾驶感知模块的调试方法,提升开发效率。

weixin_29084111的博客 139

Rstudio安装org.Hs.eg.db

自己也是个小白,初次安装org.Hs.eg.db碰到好多问题,步骤总结如下: 第一,instal.packages()安装,不行则换 BiocManager::install() 第二,如BiocManager不成,说明不是最新版本,可按提示安装最新版 BiocManager::install(version = '3.13') #由于R版本较新,按照提示中的相关信息,安装最新版本的 第三,再次安装 BiocManager::install("org.Hs.eg.db") 第四,之后每个人.

ZH_DDong的博客 2万+

企业级Java应用集成ONLYOFFICE Docs:文档协作功能实现方案

在企业级应用中集成文档协作功能,需平衡易用性、安全性和扩展性。ONLYOFFICE Docs作为开源协作办公套件,通过开放API和跨平台特性,为Java开发者提供了理想的文档协作引擎。 **核心优势对比**: | 特性 | ONLYOFFICE Docs | 传统Office集成 | 其他开源方案 | |---------...

gitblog_00781的博客 1067

【ubuntu】如何搭建AFTR+B4环境

为何要使用ipv6 目前ipv4地址已经不够用了,而IPv6采用128位地址长度,几乎可以不受限制地提供地址。而且ipv6具有更高的安全性。 主流的ipv6方案 1.双栈方案 :所有设备同时支持IPv4/IPv6协议栈,核心理念在于其传送网同时支持IPv4和IPv6 2.DS-Lite方案 :IPv4‐in‐IPv6 隧道和 NAT 这两个基本技术,同时支持IPV4与IPV6,对于ipv4用户,可以通过ipv6隧道与ipv4业务平台实现通信;针对ipv6用户,可直接通过ipv6网络通信。 3.6RD方案 :

weixin_43863426的博客 2723

揭秘WebSocket并发冲突处理:Java实现多人实时协作编辑的核心技术

解决多人实时编辑冲突,揭秘Java实现基于WebSocket的实时协作编辑系统(类似Google Docs)核心技术。适用于在线文档、协同办公等场景,采用操作变换(OT)算法与消息队列保障数据一致性,支持高并发低延迟。架构清晰,易于扩展,值得收藏。

QuickTrans的博客 1120

YOLO26创新改进 | 全网独家创新篇、小目标检测专属 | AAAI 2025 | 引入HS-FPN中的HFP和SDP创新点,从频域增强小目标特征,淘汰FPN进行升级,助力YOLO26有效涨点

本文提出HS-FPN特征金字塔网络,通过高频感知模块(HFP)和空间依赖感知模块(SDP)优化YOLO26模型。HFP利用高通滤波器增强小目标的高频特征,SDP捕获相邻像素的空间依赖关系。在AI-TOD等小目标检测数据集上,HS-FPN相比传统FPN显著提升性能。文章详细介绍了HFP和SDP的模块结构、核心代码实现,以及如何在YOLO26中集成这两个模块的配置方法,提供了多个版本的yaml文件配置方案。实验结果表明该方法能有效改善微小目标检测效果。

Ai缝合怪、助力小伙伴高效发论文 207

在线考试题库抓取:Python 爬虫抓取各类在线考试平台题库和试题

通过这些技术,您可以抓取各类在线考试平台上的题库数据,进行数据分析、生成练习题集,甚至用于考试准备。为了演示抓取过程,本篇博客选择了两个常见的在线考试平台进行数据抓取:一个是教育考试平台(如“中小学题库”),另一个是职业考试平台(如“华图教育”)。对于这些网站,我们需要找到包含题库信息的页面,并分析每一页的 HTML 结构,从而定位到题目、选项、答案等数据。大多数在线考试平台的题库是分页显示的,因此我们需要遍历多个页面,抓取所有的题库数据。因此,我们需要设置合适的请求头来模拟真实的浏览器请求。

2201_76125261的博客 3438

Java实现在线文档协作编辑(WebSocket+CRDT算法深度解析)

解决多人实时协同编辑难题,本文详解Java实现基于WebSocket的实时协作编辑系统,结合CRDT算法保证数据一致性,适用于在线文档、白板等场景。系统高并发、低延迟,支持冲突自由合并,架构清晰可扩展,值得收藏。

PoliSeed的博客 976

DSPy 入门: 再见提示,你好编程

DSPy("Declarative Self-improving Language Programs (in Python)",发音为 "dee-es-pie")[1] 是斯坦福大学 NLP 研究人员开发的 "基础模型编程 "框架。它强调编程而非提示,并将构建基于 LM 的管道从操作提示转向编程。因此,它旨在解决构建基于 LM 应用程序时的脆弱性问题。DSPy 还将程序的信息流与每一步的参数(提示和 LM 权重)分离开来,为构建基于 LM 的应用程序提供了更系统的方法。

具身机器人和通用AI 3486

Java-WebSocket教育平台:在线协作编辑功能实现

你是否在教学过程中遇到过以下问题?学生代码提交延迟导致反馈不及时、多人协作时版本冲突频发、实时答疑受限于异步沟通工具。本文将基于Java-WebSocket构建一套轻量级在线协作编辑系统,实现毫秒级内容同步、用户状态追踪和操作冲突解决,帮助教育者打造沉浸式互动课堂。 读完本文你将获得: - 基于Java-WebSocket的实时通信架构设计方案 - 协作编辑核心功能(用户状态同步、内容变更广播)...

gitblog_00189的博客 1088

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Java实时协作编辑系统构建指南】:从零实现WebSocket驱动的多人协同编辑技术

掌握多人实时协同编辑技术,本文详解Java实现基于WebSocket的实时协作编辑系统,涵盖文档同步、冲突处理与在线协作场景,采用Spring Boot与STOMP协议实现实时通信,低延迟高可靠,值得收藏。

Algorift的博客 814

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SpringBoot集成ONLYOFFICE实现文档实时协作

在企业级应用开发中,文档协作功能已成为提升团队效率的关键需求。通过微服务架构与开源技术的结合,可以实现高效的实时协同编辑解决方案。SpringBoot作为Java生态的主流框架,与ONLYOFFICE文档服务器的集成,能够为系统快速添加Office文档的在线编辑能力。该方案基于WebSocket实现实时数据同步,支持多人同时编辑、版本控制、格式兼容等核心功能。在技术实现上,通过JWT保证通信安全,结合Redis缓存优化性能,适用于合同审批、在线教育等多种场景。特别是在知识管理系统、电子签章流程等企业应用中,

weixin_30333885的博客 463

【Java实时协作编辑系统实战】:手把手教你用WebSocket打造类似Google Docs的在线编辑器

掌握Java实现基于WebSocket的实时协作编辑系统(类似Google Docs),本文手把手教你构建低延迟、高并发的在线文档协同编辑器。适用于多人协作场景,采用Java+WebSocket实现实时同步与冲突处理,架构清晰易扩展,值得收藏。

StepLens的博客 786

springboot集成webSocket实现实时推送

springboot集成webSocket实现实时推送webSocket是什么?新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 webSocket是什么? 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。

Liu_black的博客 5336

Hocuspocus实时协作框架:3步构建多人实时编辑应用

想象一下:你的团队正在协作编辑同一个文档,每个人都能看到他人的实时修改,没有冲突,无需刷新页面。这就是Hocuspocus实时协作框架带来的魔法体验!作为基于Yjs CRDT的WebSocket后端,Hocuspocus让开发者能够轻松为应用添加实时协作功能,解决多人同时编辑的数据冲突问题。 ## 为什么需要Hocuspocus?传统协作方案的痛点 在多人实时协作场景中,开发者常常面临以下挑战

gitblog_00190的博客 830

体育数据API实操专栏:主流接口选型与对比

对于追求快速上线、稳定运营和良好性价比的国内体育应用项目,选择一个像火星数据这样在稳定性、实时性、开发体验和本土化支持上表现均衡的商业数据服务,往往是风险最低、效率最高的技术决策。对于计划投入运营的国内商业项目(如资讯APP、数据分析平台、互动游戏),稳定性、实时性和持续的本地化支持是比“数据广度”更优先的考量因素。在可控成本下获得稳定、实时、丰富的服务,能让你专注于产品核心逻辑开发,而非不断处理数据源的各种“坑”。在体育应用开发中,数据接口的选型直接决定了产品的数据根基、功能上限与用户体验。

2503_93875272的博客 1239

从零开始的使用SpringBoot和WebSocket打造实时共享文档应用

WebSocket 是一种网络协议,它提供了一个全双工的通信通道,允许客户端和服务器之间进行实时、双向的数据传输。与传统的 HTTP 协议不同,WebSocket 连接在建立后会保持打开状态,不需要频繁的建立连接,从而大大提高了数据交换的效率。WebSocket 协议通常用于实时聊天、在线游戏、金融行情推送等场景。在本文中,我们将利用 WebSocket 来实现一个共享文本框。

MADAO的博客 1716
上一篇: 原生镜像构建太难?掌握这8个技巧,Spring Boot 3.3启动秒级不是梦
下一篇: 【系统级编程新范式】:C++20协程+异步IO实现零延迟响应的秘诀
AlgoFun
博客等级 码龄1年 144粉丝 1993原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值