学习websocket的部分总结

WebSocket实例—初级聊天室(来自Tomcat8的examples) 程序跑起来在Tomcat的Webapps中自带有Tomcat的很多小例子。本文选取其中的关于WebSocket的例子,来进行学习。首先先将程序跑起来。 开发环境eclipse+tomcat8 1、新建项目名称为examples(自取名字也可以,但是在程序中也要更改,这里避免麻烦,就不该了) 2、将websocket文件夹拷贝到WebContent目录下 3、将WEB-INF/classes文 阅读详情

一:websocket的特性

WebSocket 是一种先进的通信协议,提供了客户端和服务器之间的全双工、低延迟、实时通信通道。以下是 WebSocket 的主要特性:

  1. 全双工通信

    特性:WebSocket 允许客户端和服务器之间的双向通信,可以同时发送和接收数据。
    优势:减少了网络延迟,提高了数据传输效率,适合实时应用,如在线游戏、实时聊天、股票交易等。

  2. 持久连接

    特性:WebSocket 连接一旦建立,可以持续保持,直到一方主动关闭连接。
    优势:避免了 HTTP 轮询的频繁连接开销,降低了服务器和客户端的资源消耗。

  3. 低开销

    特性:WebSocket 连接建立后,后续数据传输不再需要附带 HTTP 头信息,开销较小。
    优势:数据帧结构简单,传输效率高,适合高频率、小数据量的实时传输。

  4. 实时性

    特性:WebSocket 可以在事件发生时立即推送消息,而不需要客户端主动请求。
    优势:显著提高了数据传输的实时性,用户体验更加流畅。

  5. 安全性

    特性:WebSocket 支持加密传输(wss://),确保数据在传输过程中的安全性。
    优势:防止数据在传输过程中被窃听或篡改,适合对安全性要求较高的应用场景。

  6. 简单的 API

    特性:WebSocket API 简单易用,主要包括打开连接、发送消息、接收消息和关闭连接四个基本操作。
    优势:开发者可以快速上手,实现复杂的实时通信功能。

  7. 心跳机制

    特性:WebSocket 支持心跳检测机制,确保连接的活跃性。
    优势:及时发现和处理连接断开的问题,保持连接的可靠性。

  8. 二进制和文本数据传输

    特性:WebSocket 支持传输二进制数据和文本数据。
    优势:可以满足不同类型的数据传输需求,如图片、视频、音频等。

  9. 浏览器兼容性

    特性:主流浏览器均支持 WebSocket 协议。
    优势:可以在各种浏览器环境下使用,适应性强,应用范围广泛。

  10. 协议支持

    特性:WebSocket 是一种标准协议,具有良好的兼容性和可扩展性。
    优势:可以与其他网络协议无缝集成,扩展能力强,适应各种复杂的网络应用场景。

示例代码
服务端(Go 语言)

go

package main

import (
    "log"
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            return
        }
        if err := conn.WriteMessage(messageType, p); err != nil {
            log.Println(err)
            return
        }
    }
}

func main() {
    http.HandleFunc("/ws", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

客户端(JavaScript)

javascript

let socket = new WebSocket("ws://localhost:8080/ws");

socket.onopen = function(e) {
  console.log("[open] Connection established");
  socket.send("Hello Server!");
};

socket.onmessage = function(event) {
  console.log(`[message] Data received from server: ${event.data}`);
};

socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`);
  } else {
    console.log('[close] Connection died');
  }
};

socket.onerror = function(error) {
  console.log(`[error] ${error.message}`);
};
总结

WebSocket 的全双工通信、持久连接、低开销和实时性等特性,使其非常适合需要实时数据传输的应用场景。通过 WebSocket,可以大幅提高数据传输的效率和用户体验,在现代 Web 应用中得到了广泛的应用。

二:WebSocket 请求方式

WebSocket 请求并不完全是一个传统的 HTTP 请求,虽然它使用 HTTP 协议进行握手,但它并不遵循 GET、POST 等传统的 HTTP 方法。WebSocket 握手请求看起来类似于一个 HTTP GET 请求,但它有一些特定的头信息来启动 WebSocket 连接。

1、WebSocket 握手过程

客户端发起一个类似于 HTTP GET 请求的握手请求,其中包含一些特殊的头字段:
Upgrade: websocket 表示请求升级到 WebSocket 协议。
Connection: Upgrade 表示升级连接。
Sec-WebSocket-Key 是一个 Base64 编码的随机密钥,用于安全验证。
Sec-WebSocket-Version 表示 WebSocket 协议版本(一般为 13)。

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
2、服务器响应握手请求:

服务器收到握手请求后,检查请求头字段是否符合 WebSocket 协议的要求。如果符合,会返回一个 101 Switching Protocols 的响应,表示协议切换成功:
Upgrade: websocket 表示确认升级到 WebSocket 协议。
Connection: Upgrade 表示确认升级连接。
Sec-WebSocket-Accept 是根据客户端的 Sec-WebSocket-Key 生成的一个校验值,用于验证握手请求的合法性。
示例握手响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
3、建立 WebSocket 连接:

握手成功后,客户端和服务器之间的连接正式升级为 WebSocket 连接。在这个连接上,客户端和服务器可以相互发送和接收消息,不再使用 HTTP 协议,而是使用 WebSocket 协议进行全双工通信。

总结

WebSocket 握手仅在连接建立时使用 HTTP 协议,握手成功后,通信完全使用 WebSocket 协议进行全双工的消息传输。

三、websockt双全工通信的消息格式大概是什么样子的?心跳帧的内容又是什么样子的?

WebSocket 使用帧(frame)来传输数据,每个帧都有自己的结构和格式。下面是 WebSocket 帧的结构和心跳帧的内容。

WebSocket 帧结构

WebSocket 帧的格式如下:
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| OP   |M| PAYLOAD LEN          |    EXTENDED PAYLOAD LENGTH    |
|I|S|S|S| CODE |A|                       | (if PAYLOAD LEN==126/127)     |
|N|V|V|V|      |S|                       |                               |
| |1|2|3|      |K|                       +-------------------------------+
| | | | |      | |                       |     EXTENDED PAYLOAD LENGTH   |
| | | | |      | |                       |        (if PAYLOAD LEN==127)  |
| | | | |      | |                       +-------------------------------+
| | | | |      | |                       |  MASKING KEY (if MASK==1)     |
| | | | |      | |                       +-------------------------------+
| | | | |      | |                       |          PAYLOAD DATA         |
| | | | |      | |                       +-------------------------------+
| | | | |      | |                       |        PAYLOAD DATA           |
| | | | |      | |                       +-------------------------------+
| | | | |      | |                       |        PAYLOAD DATA           |
| | | | |      | |                       +-------------------------------+

字段说明:
FIN (1 bit): 表示是否是消息的最后一帧。1 表示是,0 表示还有后续帧。
RSV1, RSV2, RSV3 (3 bits): 保留位,通常为 0,除非双方协议另有约定。
Opcode (4 bits): 表示帧的类型。常见的值有:

0x0 (继续帧)
0x1 (文本帧)
0x2 (二进制帧)
0x8 (关闭帧)
0x9 (Ping 帧)
0xA (Pong 帧)

Mask (1 bit): 表示是否对负载数据进行了掩码处理。客户端到服务器的消息需要掩码。
Payload length (7 bits, 7+16 bits, 7+64 bits): 表示负载数据的长度。

0-125 表示数据的直接长度。
126 表示使用 16 位无符号整数来表示长度。
127 表示使用 64 位无符号整数来表示长度

Masking key (0 or 4 bytes): 如果 Mask 为 1,则包含 4 字节的掩码键。
Payload data (x bytes): 实际传输的数据。长度由 Payload length 指定。

心跳帧(Ping/Pong 帧)

WebSocket 使用 Ping/Pong 帧来保持连接活跃,检测对方是否在线。这是一种心跳机制。

Ping 帧:
Opcode: 0x9

服务器或客户端发送 Ping 帧对方以检测连接。
通常包含负载数据,但不是必须的。

Pong 帧:
Opcode: 0xA

收到 Ping 帧的一方必须回复 Pong 帧。
Pong 帧可以包含与 Ping 帧相同的负载数据,也可以为空。

总结

1、帧结构:WebSocket 使用帧来传输数据,每个帧包含控制信息和负载数据。

2、心跳机制:Ping/Pong 帧用于检测连接的活跃状态,防止连接因长时间未使用而被关闭。

3、消息格式:WebSocket 的消息可以是文本或二进制数据,由帧头的 Opcode 指定。

Springboot 整合 WebSocket ,使用STOMP协议 ,前后端整合实战 (一) 资料过多,篇幅有限,需要文中全部资料可以点击这里获取前端面试资料PDF完整版!自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。学效果低效又漫长,而且极易碰到天花板技术停滞不前!**因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-6xJQtneu-1712956290292)][外链图片转存中…(img-P1sQnpV7-1712956290293)] 阅读详情

相关推荐

Java for Web学习笔记(四七) WebSocket(4)Java Client和二进制消息

Java for Web学习笔记(四七) WebSocket(4)Java Client和二进制消息

skdhfdfc的博客 1114

websocket实践

websocket入门实践

今天你被AI优化了么 2561

PHP WebSocket客户端实现指南

WebSocket是HTML5规范中定义的一种全双工通信协议,它提供了一种在单个TCP连接上进行双向数据传输的方法。与传统的HTTP协议相比,WebSocket能够在客户端和服务器之间建立持久的连接,允许服务器主动向客户端推送数据,非常适合实时交互应用,如在线游戏、聊天室、实时监控等场景。WebSocket协议的引入,解决了Web应用中实时通信的需求。它允许在浏览器和服务器之间建立稳定的通信渠道,不再需要轮询或长轮询等传统解决方案。这种协议的出现,使得开发者能够构建更为动态的网络应用,提高用户体验。

weixin_42400643的博客 1359

网络程序设计课程报告——基于WebSocket的在线聊天室

本项目基于WebSocket的原理利用express框架开发了一个可以实现多人实时聊天功能的在线聊天室。聊天室支持用户选择合适的头像并保证用户名的唯一性,用户可以通过用户列表来查看当前在线用户,有用户加入或者退出时系统也会发出消息提醒,可发送内容包括文字和本地存储的图片,新登录用户还可以查看历史消息记录。聊天室运行时,WebSocket的应用保证了消息传输的实时性,同时尽可能地减小了服务器的开销,提高了效率。

jxhhzzk的博客 1405

WebSocket 小白快速入门(2025)

WebSocket 小白快速入门(2025)

白白白鲤鱼的博客 3936

WebSocket的稳定性思考和处理方案

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它被设计用于在客户端和服务器之间进行实时、低延迟的数据交换,尤其适合需要频繁双向数据传输的应用场景。WebSocket协议在2008年首次提出,并在2011年成为IETF标准RFC 6455。

全栈工程师,热爱编程,喜欢探索各种技术栈。分享前端、后端、数据库等技术学习心得,以及在项目开发中的实践经验。 1563

WebSocket技术解析:原理、特点、应用场景及实现方法

WebSocket技术是一种基于TCP协议的全双工通信协议,可以实现实时通信、数据推送、实时监控等应用场景。它具有实时性更高、减少网络带宽的使用、双向通信、跨域支持、安全性更高等特点。在使用WebSocket技术时,需要先创建一个WebSocket对象,然后通过该对象与服务器进行通信。

qq_28245087的博客 6329

通讯框架 t-io 学习——websocket 部分源码解析

前言   前端时间看了看t-io的websocket部分源码,于是抽时间看了看websocket的握手和他的通讯机制。本篇只是简单记录一下websocket握手部分WebSocket握手   好多人都用过websocket,不过有的都是在框架之上,只知道连接某个地址,然后调用js API就可以使用websocket了。但是通过阅读t-io的源码才稍微有点明白,服务端到底做了什么。将t-i...

weixin_30900589的博客 432

python web重要部分学习

python重要部分学习 websocket flask asyncio 线程进程锁

sinat_28375239的博客 116

Netty案例介绍(websocket服务)

总结来说,面试成功=基础知识+项目经验+表达技巧+运气。我们无法控制运气,但是我们可以在别的地方花更多时间,每个环节都提前做好准备。面试一方面是为了找到工作,升职加薪,另一方面也是对于自我能力的考察。能够面试成功不仅仅是来自面试前的临时抱佛脚,更重要的是在平时学习和工作中不断积累和坚持,把每个知识点、每一次项目开发、每次遇到的难点知识,做好积累,实践和总结。点击这里领取Web前端开发经典面试题得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)**

2301_81749759的博客 879

springboot业务功能实战(四)告别轮询,websocket的集成使用

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!

2301_79055083的博客 927

C 实现的WebSocket服务端和客户端

C# 实现的WebSocket服务端和客户端 去发现同类优质开源项目:https://gitcode.com/ 简介 此资源库包含了使用C#语言实现的WebSocket服务端和客户端的代码示例。WebSocket是一种网络通信协议,提供了服务器和客户端之间的全双工通信渠道。通过此示例,您可以了解到如何在C#中创建WebSocket连接,实现数据的发送和接收。 文件结构 Server - 包含实现...

gitblog_06737的博客 677

WebSocket入门教程(四)-- WebSocket实例:实时获取服务器内存使用情况(优化一)...

WebSocket入门教程(四)– WebSocket实例:实时获取服务器内存使用情况(优化一)

柳木木的IT专栏 660

Vue 全局 websocket,大学生必备

核心竞争力,怎么才能提高呢?成年人想要改变生活,逆转状态?那就开始学习吧~万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。

radcb55226的博客 1250

php websocket 客户端_php实时推送系统消息给客户端

在我们实际开发过程中,有些数据需要实时获取;比如erp系统中的订单信息,OA系统中的流程审批等都需要及时处理,这时我们就不能再使用http协议了;当然也可以使用轮询的机制。但是轮询请求中有大半是无用,浪费带宽和服务器资源。很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,希望能够去帮助到小伙伴们,可以加入一下我创建的圈子【P...

weixin_39605296的博客 953

websocket协议引发的一系列心理活动

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!

2401_84153158的博客 319

websocket编写聊天室

websocket编写聊天室

wang_book的博客 568

websocket实现聊天室应用,包括文字和图片上传_websocket onmessage怎么接收客户端的图片(2)

响应以上报文和一般的HTTP有很多不同的地方:1、请求和响应都有Upgrade: websocket和Connection: Upgrade,这是协议转换的意思,也就是请求时告诉服务器,本次连接需要的是websocket通信协议,而不是一般的HTTP,响应也带有该响应头表示转换成功。

2401_84978490的博客 524
上一篇: 记录一次服务器磁盘被占满,导致服务无法运行的问题。
下一篇: 关于依赖注入的相关笔记
xiamu66
博客等级 码龄8年 67粉丝 13原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值