【Java EE】网络通信中的 4 种交互模式

网络通信中的 4 种交互模式

一问一答(请求-响应模式)

这是最经典、最基础的交互模式。
Server Client Server Client 请求 响应

代表协议

  • HTTP / HTTPS
  • DNS 查询
  • SQL 查询(非流式)

适用场景

  • 网页浏览
  • RESTful API
  • 普通的增删改查操作

特点

  • 简单、无状态
  • 客户端必须主动发起
  • 服务器不能主动推送

✅ 适合"我问你答一次就结束"的场景

一问多答(订阅 / 推送模式)

客户端只发一次请求,服务器持续返回多条数据。
Server Client Server Client loop 持续推送 订阅请求 数据 1 数据 2 数据 N

代表技术

  • SSE(Server‑Sent Events)
  • WebSocket(单向推送视角)
  • RSS 订阅
  • Kafka / MQTT 订阅

适用场景

  • 股票行情
  • 比赛实时比分
  • 新闻 / 微博时间线推送
  • 实时日志监控

特点

  • 一次订阅,多次推送
  • 服务器有"主动说话"能力(有限)
  • 适合 观察者模式

多问一答(批量 / 聚合模式)

客户端发起多个请求,服务器聚合后返回一次响应。
Server Client Server Client 请求 A 请求 B 请求 C 统一聚合响应

代表技术

  • HTTP/2 多路复用
  • GraphQL
  • 分片上传(最后一次性确认)

典型场景

1. 大文件分片上传

  • 客户端将文件切成 1MB 的小块
  • 并发上传多个分片
  • 服务器全部收齐后返回"上传成功"

2. GraphQL

  • 一次请求获取用户、订单、商品列表
  • 减少网络往返次数

特点

  • 减少网络往返(RTT)
  • 更高效的批量处理
  • 客户端与服务器之间有"多对一"的约定

多问多答(双向实时通信模式)

建立连接后,双方都可以随时主动发送消息。
Server Client Server Client loop 全双工通信 连接建立 控制指令 画面数据 状态通知 心跳 / 操作

代表技术

  • WebSocket
  • TCP / UDP 长连接
  • MQTT
  • SignalR / Socket.IO

典型场景

场景 说明
远程控制(ToDesk / TeamViewer) 控制端输入指令,被控端持续回传屏幕画面
在线聊天(微信 / 钉钉) 双方任意时刻都能发送消息
多人在线游戏 玩家动作广播 + 服务器推送状态
实时协同文档 多人同时编辑,互相看到光标和内容

特点

  • 真正的 双向实时
  • 需要维护长连接
  • 复杂度远高于一问一答

四种模式对比总结

模式 请求次数 响应次数 方向 代表技术 典型场景
一问一答 1 1 单向请求 HTTP 普通 API
一问多答 1 N 订阅推送 SSE、WebSocket 行情推送
多问一答 N 1 批量聚合 GraphQL、分片上传 批量查询
多问多答 N N 双向实时 WebSocket、MQTT 聊天、游戏

如何选择合适的模式?

1次响应
多次响应
不需要
需要
客户端与服务器交互

需要几次响应?
一问一答

HTTP / API
是否需要客户端

持续主动发送?
一问多答

SSE / 订阅推送
多问多答

WebSocket / 长连接
简单、无状态
订阅、观察者模式
双向实时、高复杂度

相关推荐
yxlalm2 小时前
Spring AI+RAG 01-项目背景与技术选型
java·人工智能·spring
程序员清风2 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
java·数据库·oracle
Seoyoneh3 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
海南java第二人3 小时前
对外 API 如何保证幂等性?插入数据 / 上传表格场景全方案汇总
java·幂等性
tryxr3 小时前
Chat2Excel 文件服务模块上传文件功能开发
java·项目·oss·easyexcel·文件服务
Tangyuewei3 小时前
Java 写 Agent:模型只是组件
java·开发语言
彧azz4 小时前
Java学习语法篇:变量
java·学习
信誓旦旦的程序猿5 小时前
【量化系统从零构建 #04】存储设计:选型·建库·交易日历
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
yurenpai(27届找实习中)5 小时前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
Flynt6 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端