当前位置: 首页 > article >正文

WebSocket协议详解

前言

WebSocket协议是一种在单个TCP连接上进行全双工通信的应用层协议,位于OSI模型的应用层。它允许服务器主动向客户端推送信息,也可以允许客户端主动向服务器发送信息。WebSocket协议的出现主要是为了解决基于HTTP/1.x的Web应用无法实现服务端向客户端主动推送的问题。虽然WebSocket协议在建立连接时会使用HTTP协议,但这并不意味着WebSocket协议是基于HTTP协议实现的。

连接建立过程

WebSocket协议的建立连接过程如下:

  1. 客户端发送一个HTTP请求到服务器,请求中包括希望升级为WebSocket协议的信息,即在请求头中包含Upgrade字段,值为"websocket"。
  2. 服务器收到请求后,会返回一个HTTP 101状态码,表示同意升级为WebSocket协议,同时在响应头中添加Upgrade字段和Connection字段,告知客户端已升级为WebSocket协议。
  3. 客户端收到服务器的响应后,会通过TCP通道进行传输通信。

主要特点

WebSocket协议有以下几个特点:

  1. 单一的TCP连接:WebSocket协议使用单一的TCP连接进行全双工通信,避免了传统的HTTP协议需要建立多个连接的缺陷。
  2. 双向平等对话:WebSocket协议允许客户端和服务器任意时刻发送信息,不再需要轮询或者主动连接。
  3. 头部信息、Cookie和身份验证:WebSocket协议没有头部信息、Cookie和身份验证等开销,因此性能开销小,通信效率高。
  4. 保持链路激活:通过“ping/pong”帧来保持链路激活,避免因长时间无数据交互而断开连接。
  5. 全双工模式:WebSocket是真正意义上的全双工模式,即客户端和服务器可以随时发送信息。
  6. 与HTTP协议的良好兼容性:WebSocket建立在TCP协议上,与HTTP协议有着良好的兼容性,握手阶段采用HTTP协议,因此能通过各种HTTP代理服务器进行传输。
  7. 可以发送文本或二进制数据:WebSocket协议可以发送文本或二进制数据,满足不同的数据传输需求。
  8. 无同源限制:WebSocket客户端可以与任意服务器通信,没有同源限制。

以上是WebSocket协议的主要特点,它为http等应用层协议提供服务,解决了传统HTTP/1.x协议无法实现服务端向客户端主动推送信息的缺陷,使得实时通信变得更加高效和便捷。

优点和缺点

WebSocket协议的优点包括:

  1. 减少请求费时费资源:通过真正的全双工方式,建立连接后,服务器与客户端可以完全对等,可以相互请求,减少了不必要的网络请求时间损耗和网络流量。
  2. 持久连接:WebSocket协议通过第一个request建立TCP连接后,只要不主动关闭,就能一直保持连接状态交换数据。
  3. 服务端可以主动向客户端发送消息。
  4. 使用场景广泛:WebSocket的使用场景包括社交聊天、弹幕、多玩家游戏、协同编辑、股票基金实时报价、体育实况更新、视频会议/聊天、基于位置的应用、在线教育、智能家居等需要高实时的场景。

WebSocket协议的缺点包括:

  1. 协议较复杂,不是所有浏览器都支持,如果连接失败或丢失连接可能会产生一些问题。

以上是WebSocket协议的优点和缺点,在使用时可以结合这些特点进行综合考虑。

应用场景

WebSocket协议的应用场景包括但不限于:

  1. 社交应用:实现实时聊天、实时消息推送等功能,使得社交应用更加互动、高效。
  2. 游戏开发:用于实现游戏服务器与客户端之间的实时通信,支持多人在线游戏和实时互动。
  3. 实时数据传输:例如金融交易系统、实时数据分析系统等,用于实时传输数据。
  4. 实时控制:用于实现远程控制、自动化设备等需要实时反馈的场景。
  5. 实时监控:例如监控设备状态、监控交通流量等实时监控系统。

WebSocket与HTTP的区别

WebSocket与HTTP的区别主要体现在以下几个方面:

  1. 连接方式:WebSocket需要浏览器和服务器握手进行建立连接,而HTTP是浏览器发起向服务器的连接,服务器预先并不知道这个连接。
  2. 连接长度:WebSocket是持久连接,而HTTP是短连接,即HTTP是可以通过Ajax一直发送请求和长轮循保持一段时间内的连接,但本质上还是短连接。
  3. 连接状态:WebSocket是有状态的双向连接,而HTTP是无状态的双向连接。
  4. 通信方式:WebSocket是一种双向通信协议,模拟Socket协议,可以双向发送或接受信息,而HTTP是单向的。
  5. 兼容性:WebSocket和HTTP都是基于TCP协议,且兼容性都很好。在连接的建立过程中,对错误的处理方式相同,都使用Request/Response模型进行连接的建立。

总的来说,WebSocket是对HTTP协议的一种补充,解决了HTTP无法实现双向通信的问题。

Java实现WebSocket示例

下面是一个简单的Java实现WebSocket的示例代码:

import java.io.IOException;
import java.net.URI;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.java_websocket.server.WebSocketServer;

public class WebSocketExample {
    public static void main(String[] args) {
        // 创建WebSocket客户端并连接服务器
        WebSocketClient client = new WebSocketClient(new URI("ws://localhost:8080/websocket")) {
            @Override
            public void onOpen(ServerHandshake handshakedata) {
                System.out.println("连接成功");
                // 发送消息到服务器
                sendMessage("Hello, WebSocket!");
            }

            @Override
            public void onMessage(String message) {
                System.out.println("收到服务器消息:" + message);
            }

            @Override
            public void onClose(int code, String reason, boolean remote) {
                System.out.println("连接断开");
            }

            @Override
            public void onError(Exception ex) {
                ex.printStackTrace();
            }
        };
        try {
            client.connectBlocking(5000); // 连接服务器,等待5秒超时
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            e.printStackTrace();
        }
    }
}

这个示例代码使用Java WebSocket API实现了一个WebSocket客户端,连接到指定的WebSocket服务器并发送/接收消息。在这个示例中,我们创建了一个WebSocketClient对象,并重写了onOpenonMessageonCloseonError方法来处理连接、消息、关闭和错误事件。然后,我们调用connectBlocking方法来连接服务器,并等待5秒钟超时。如果连接成功,我们发送一条消息到服务器,并在收到服务器消息时打印出来。如果连接断开或出现错误,我们也会打印相关的异常信息。

拓展

通过下面的链接,我们一起来来了解更多的常用的一些网络协议

HTTP/2.0协议详解

HTTP1.1协议详解

gRPC协议详解

QUIC协议详解

Dubbo协议详解

RMI协议详解

Hessian协议详解

HTTP1.0协议详解


http://www.kler.cn/a/136133.html

相关文章:

  • 【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例
  • fastdds:idl
  • UDP系统控制器_音量控制、电脑关机、文件打开、PPT演示、任务栏自动隐藏
  • 多智能体/多机器人网络中的图论法
  • RabbitMQ 路由(Routing)通讯方式详解
  • vue预览和下载 pdf、ppt、word、excel文档,文件类型为链接或者base64格式或者文件流,
  • linux rsyslog综合实战1
  • CI/CD相关概念学习
  • Apache POI(Java)
  • flask实现session开发
  • 1. hadoop环境准备
  • 基于一致性算法的微电网分布式控制MATLAB仿真模型
  • Java格式化类Format
  • 电子学会C/C++编程等级考试2022年06月(一级)真题解析
  • 初识分布式键值对存储etcd
  • Zotero在word中插入带超链接的参考文献/交叉引用/跳转参考文献
  • 工作记录---为什么双11当天不能申请退款?(有趣~)
  • 万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志分层
  • 2023-11-18 mysql-sysbench压测TPS/QPS-记录
  • LangChain 5易速鲜花内部问答系统
  • 使用cli批量下载GitHub仓库中所有的release
  • 暖阳脚本_ 将Agent技术的灵活性引入RPA,清华等发布自动化智能体ProAgent
  • SpringCloud--分布式锁实现
  • K8S配置资源管理
  • 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C卷
  • 【grafana | clickhouse】实现展示多折线图