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));
    }

    @Override
    public void onOpen(WebSocket conn, ClientHandshake handshake) {
        System.out.println("新的连接: " + conn.getRemoteSocketAddress());
        conn.send("欢迎连接到 WebSocket 服务器!");
    }

    @Override
    public void onClose(WebSocket conn, int code, String reason, boolean remote) {
        System.out.println("连接关闭: " + conn.getRemoteSocketAddress());
    }

    @Override
    public void onMessage(WebSocket conn, String message) {
        System.out.println("收到消息: " + message + " 来自: " + conn.getRemoteSocketAddress());
        conn.send("服务器收到消息: " + message);
    }

    @Override
    public void onError(WebSocket conn, Exception ex) {
        ex.printStackTrace();
        if (conn != null) {
            // 处理错误
        }
    }

    @Override
    public void onStart() {
        System.out.println("WebSocket 服务器已启动,监听端口: " + getPort());
    }

    public static void main(String[] args) {
        int port = 8887;
        MyWebSocketServer server = new MyWebSocketServer(port);
        server.start();
    }
}
相关推荐
大布布将军10 分钟前
⚡️编排的艺术:BFF 的核心职能——数据聚合与 HTTP 请求
前端·网络·网络协议·程序人生·http·node.js·改行学it
_F_y17 分钟前
Socket编程UDP
网络·网络协议·udp
roman_日积跬步-终至千里18 分钟前
【源码分析】StarRocks EditLog 写入与 Replay 完整流程分析
java·网络·python
车载测试工程师18 分钟前
CAPL学习-AVB交互层-媒体函数1-回调&基本函数
网络·学习·tcp/ip·媒体·capl·canoe
爱尔兰极光39 分钟前
计算机网络--TCP传输
网络·tcp/ip·计算机网络
醉舞经阁半卷书143 分钟前
zookeeper服务端配置
网络·分布式·zookeeper
晚风(●•σ )2 小时前
【华为 ICT & HCIA & eNSP 习题汇总】——题目集27
网络·计算机网络·网络安全·华为
寰天柚子9 小时前
裸金属服务器深度解析:适用场景、选型指南与运维实践
服务器·网络·github
GTgiantech9 小时前
精准成本控制与单向通信优化:1X9、SFP单收/单发光模块专业解析
运维·网络
Suchadar9 小时前
ACL访问控制列表协议
网络·智能路由器