【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 / 长连接
简单、无状态
订阅、观察者模式
双向实时、高复杂度

相关推荐
橙淮6 分钟前
并发编程(六)
java·jvm
拽着尾巴的鱼儿12 分钟前
springboot openfeign 自定义feign 接口重试机制
java·spring boot·后端
白露与泡影18 分钟前
2026大厂Java面试题大全!牛客网最新版
java·开发语言
EntyIU1 小时前
JVM内存与GC笔记
java·jvm·笔记
XS0301061 小时前
并发编程 六
java·后端
yaoxin5211231 小时前
419. 现代 Java IO 最佳实践 - 写入文本文件
java·windows·python
雪宫街道2 小时前
synchronized 锁的范围:对象锁、类锁与代码块锁
java·jvm·后端·面试
x***r1512 小时前
linux安装 jdk-8u291-linux-x64.tar.gz 详细步骤(解压配置环境变量)
java
极光代码工作室2 小时前
基于SpringBoot的校园论坛系统
java·springboot·web开发·后端开发
XS0301063 小时前
Spring Bean 作用域 & 生命周期
java·后端·spring