Java 网络通信中的几种方式

本贴最后更新于 2361 天前,其中的信息可能已经沧海桑田

序言

最近看过一本 Java 游戏服务器开发的书,以前一直以为游戏是个比较高深的东西,跟 Java Web 开发有很大的区别,但是通读过后发现,有非常多一样的东西,比如网络编程、Java NIO、并发编程、设计模式、数据库、缓存、系统运维。这些跟 web 开发不都是密切相关的吗,可能游戏更注重的游戏逻辑,视觉效果,还有服务器的 IO 高密集度。

OSI 模型

说到网络通信就必须知道这个模型了
osi

TCP 三次握手

三次握手
曾经在知乎上看到有个很形象的对话来形容这三次握手

「你瞅啥?」
「瞅你咋地?」
「来咱俩唠唠。」

然后就唠上了。

TCP 和 UDP 的区别

TCP 特点

  • 面向连接
  • 安全可靠
  • 全双工通信
  • 一对一
  • 面向流通信

UDP 特点

  • 无连接
  • 数据无保障
  • 开销小
  • 一对一,一对多,多对多都可以(广播)

UDP 可以用在直播协议中

HTTP

HTTP 支持六种请求方法:GET,POST,HEAD,PUT,DELETE,OPTION。在 RESTful 标准规范中,这些方法都会用到。RESTful 即面向资源、无状态。

Socket

Socket 用于描述 IP 地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或计算机之间的通信。连接步骤。

  1. 服务器监听
  2. 客户端请求
  3. 连接确认

Java 的 net 包中的 Socket API 可以实现基于 UDP 或 TCP 的 Socket 服务端与客户端。

WebSocket

WebSocket 随着 HTML5 兴起的一种新协议。实现了浏览器和服务端的全双工通信,服务端可以主动向浏览器发送消息。这跟短轮询和长轮询截然不同。当浏览器想要建立 WebSocket 连接时,先发起 http 请求,并携带协议升级头信息,服务端接收到后即可建立连接。
在此有必要介绍下 Stomp 协议

STOMP 即 Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)文本定向消息协议,它提供了一个可互操作的连接格式,允许 STOMP 客户端与任意 STOMP 消息代理(Broker)进行交互。STOMP 协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。
STOMP 协议的前身是 TTMP 协议(一个简单的基于文本的协议),专为消息中间件设计。
STOMP 是一个非常简单和容易实现的协议,其设计灵感源自于 HTTP 的简单性。尽管 STOMP 协议在服务器端的实现可能有一定的难度,但客户端的实现却很容易。例如,可以使用 Telnet 登录到任何的 STOMP 代理,并与 STOMP 代理进行交互。
STOMP 协议与 2012 年 10 月 22 日发布了最新的 STOMP 1.2 规范。
要查看 STOMP 1.2 规范,见: https://stomp.github.io/stomp-specification-1.2.html

还有一个 SockJS

SockJS 是一个 JavaScript 库,提供跨浏览器 JavaScript 的 API,创建了一个低延迟、全双工的浏览器和 web 服务器之间通信通道。

该库有个好处就是,如果当前浏览器不支持 WebSocket 协议,会自动选择回退方案,比如轮询方案来保证健壮的通信。

BIO 阻塞式 IO

NIO 非阻塞式 IO

AIO 异步 IO

Mina 和 Netty

  • 网络
    128 引用 • 177 回帖 • 3 关注
  • NIO
    15 引用 • 26 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...