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

Websocket从原理到实战

引言

WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议,它使得客户端和服务器之间能够进行实时、双向的通信,既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解

发展历史

WebSocket 最初是为了解决 HTTP 协议在实时通信方面的局限性而诞生的。在传统的 HTTP 通信中,客户端与服务器之间的通信是请求 - 响应模式,服务器只能在接收到客户端请求后才能发送数据给客户端,无法主动向客户端推送数据。随着 Web 应用对实时性要求的不断提高,如在线聊天、实时游戏、股票行情实时显示等场景的出现,WebSocket 协议应运而生,它于 2011 年被 IETF 定为标准 RFC 6455,并得到了各大浏览器和服务器的广泛支持。可以说websocket伴随着移动互联网的发展。

websocket的特征

  • 建立在 TCP 协议之上;

  • 与 HTTP 协议有着良好的兼容性:

  • 默认端口也是 80(ws) 和 443(wss,运行在 TLS 之上),并且握手阶段采用 HTTP 协议;

  • 较少的控制开销:连接创建后,ws 客户端、服务端进行数据交换时,协议控制的数据包头部较小,而 HTTP 协议每次通信都需要携带完整的头部;

  • 可以发送文本,也可以发送二进制数据;

  • 没有同源限制,客户端可以与任意服务器通信;

  • 协议标识符是 ws(如果加密,则为 wss),服务器网址就是 URL;

  • 支持扩展:ws 协议定义了扩展,用户可以扩展协议,或者实现自定义的子协议(比如支持自定义压缩算法等); 

应用场景

  • 即时聊天通讯

  • 弹幕展示

  • 实时地图位置

        

实战

实现websocket服务器

引入maven依赖

<dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.5.3</version>
</dependency>

实战代码

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;import java.net.InetSocketAddress;public class MyWebSocketServer extends WebSocketServer {public MyWebSocketServer(int port) {super(new InetSocketAddress(port));}@Overridepublic void onOpen(WebSocket conn, ClientHandshake handshake) {System.out.println("新的连接: " + conn.getRemoteSocketAddress());conn.send("欢迎连接到 WebSocket 服务器!");}@Overridepublic void onClose(WebSocket conn, int code, String reason, boolean remote) {System.out.println("连接关闭: " + conn.getRemoteSocketAddress());}@Overridepublic void onMessage(WebSocket conn, String message) {System.out.println("收到消息: " + message + " 来自: " + conn.getRemoteSocketAddress());conn.send("服务器收到消息: " + message);}@Overridepublic void onError(WebSocket conn, Exception ex) {ex.printStackTrace();if (conn != null) {// 处理错误}}@Overridepublic void onStart() {System.out.println("WebSocket 服务器已启动,监听端口: " + getPort());}public static void main(String[] args) {int port = 8887;MyWebSocketServer server = new MyWebSocketServer(port);server.start();}
}

http://www.lryc.cn/news/533078.html

相关文章:

  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数
  • 判断您的Mac当前使用的是Zsh还是Bash:echo $SHELL、echo $0
  • Centos执行yum命令报错
  • 订单超时设计(1)--- 如何使用redis实现订单超时实时关闭功能
  • 485网关数据收发测试
  • RabbitMQ快速上手及入门
  • 4种架构的定义和关联
  • 109,【1】攻防世界 web 题目名称-文件包含
  • leetcode90 子集II
  • DeepSeek模型构建与训练
  • PyTorch torch.unbind、torch.split 和 torch.chunk函数介绍
  • 【愚公系列】《循序渐进Vue.js 3.x前端开发实践》061-Vue Router的动态路由
  • 杭州某小厂面试
  • C基础寒假练习(8)
  • 设计模式 ->模板方法模式(Template Method Pattern)
  • Redis存储⑤Redis五大数据类型之 List 和 Set。
  • MySQL开窗函数种类和使用总结
  • DeepSeek——DeepSeek模型部署实战
  • zsh: command not found: pip
  • 机器学习数学基础:16.方程组
  • 即梦(Dreamina)技术浅析(四):生成对抗网络
  • 2025年软件测试五大趋势:AI、API安全、云测试等前沿实践
  • Vue混入(Mixins)与插件开发深度解析
  • 【C++】C++11
  • k8sollama部署deepseek-R1模型,内网无坑
  • mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制
  • 胜任力冰山模型:深入探索职业能力的多维结构
  • 什么是三层交换技术?与二层有什么区别?
  • Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell 替代】
  • DeepSeek LLM(初代)阅读报告