WebSocket编程:Java实现实时双向通信应用

WebSocket 简介

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于需要实时交互的应用场景(如聊天、实时数据推送)。与 HTTP 不同,WebSocket 允许服务器主动向客户端推送数据,无需频繁建立连接。


Java WebSocket 实现方式

Java 提供了两种主要方式实现 WebSocket:

  1. Java API for WebSocket (JSR 356):标准 API,支持注解和编程式配置。
  2. Spring WebSocket:基于 Spring 框架的封装,简化集成(如 STOMP 协议支持)。

使用 JSR 356 实现 WebSocket

服务端实现
java 复制代码
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/ws") // 定义 WebSocket 端点路径
public class WebSocketServer {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("客户端连接: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("收到消息: " + message);
        // 向客户端发送响应
        session.getAsyncRemote().sendText("服务器回复: " + message);
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("连接关闭: " + session.getId());
    }

    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }
}
客户端实现(JavaScript 示例)
javascript 复制代码
const socket = new WebSocket("ws://localhost:8080/ws");
socket.onopen = () => console.log("连接已建立");
socket.onmessage = (event) => console.log("收到消息: " + event.data);
socket.send("Hello WebSocket!");

使用 Spring WebSocket 实现

依赖配置

Maven 需添加以下依赖:

XML 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
服务端配置
java 复制代码
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.*;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/ws").setAllowedOrigins("*");
    }
}
自定义处理器
java 复制代码
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class MyWebSocketHandler extends TextWebSocketHandler {

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) {
        System.out.println("收到消息: " + message.getPayload());
        session.sendMessage(new TextMessage("服务器回复: " + message.getPayload()));
    }
}

关键注意事项

  • 跨域问题 :确保服务端配置允许客户端域名(如 setAllowedOrigins("*"))。
  • 心跳机制:避免连接因空闲被关闭,可通过定期发送心跳消息实现。
  • 性能优化 :高并发场景下,使用 Async 方法(如 getAsyncRemote())提升吞吐量。

参考:gitee.com/a19283598491/sdcfds5/issues/IJEXNX

gitee.com/a19283598491/sdcfds5/issues/IJEXNR

gitee.com/a19283598491/sdcfds5/issues/IJEXNI

gitee.com/a19283598491/sdcfds5/blob/master/hjbh.md

gitee.com/a19283598491/sdcfds5/blob/master/dsds.md

gitee.com/a19283598491/sdcfds5/blob/master/sadsa.md

gitee.com/a19283598491/sdcfds5/blob/master/sdcdsw8.md

gitee.com/a19283598491/sdcfds5/blob/master/asd454.md

gitee.com/a19283598491/sdcfds5/blob/master/sdfcds878.md

gitee.com/a19283598491/sdcfds5/blob/master/sdds85.md

gitee.com/a19283598491/sdcfds5/blob/master/sad881.md

gitee.com/a19283598491/sdcfds5/blob/master/hdsh.md

gitee.com/a19283598491/sdcfds5/blob/master/dscds8.md

gitee.com/a19283598491/sdcfds5/blob/master/lojioj.md

gitee.com/a19283598491/sdcfds5/blob/master/asq843.md

gitee.com/a19283598491/sdcfds5/blob/master/asw101.md

gitee.com/a19283598491/sdcfds5/blob/master/asdq777.md

gitee.com/a19283598491/sdcfds5/blob/master/aws001.md

gitee.com/a19283598491/sdcfds5/blob/master/as002.md

gitee.com/a19283598491/sdcfds5/blob/master/asas003.md

gitee.com/a19283598491/sdcfds5/blob/master/miki004.md

gitee.com/a19283598491/sdcfds5/blob/master/rew01.md

gitee.com/a19283598491/sdcfds5/blob/master/jiu02.md

gitee.com/a19283598491/sdcfds5/blob/master/asddhas01.md

gitee.com/a19283598491/sdcfds5/blob/master/sdak05.md

gitee.com/a19283598491/sdcfds5/blob/master/dsq06.md

gitee.com/a19283598491/sdcfds5/blob/master/oioq08.md

gitee.com/a19283598491/sdcfds5/blob/master/dsaidis09.md

gitee.com/a19283598491/sdcfds5/blob/master/sdacg005.md

gitee.com/a19283598491/sdcfds5/blob/master/wqwq004.md


扩展功能

  • STOMP 协议:Spring WebSocket 支持 STOMP,提供更高级的消息路由功能。
  • 消息广播 :通过 SimpMessagingTemplate 向多个客户端推送消息。
  • 安全性:集成 Spring Security 实现 WebSocket 鉴权。

通过上述方法,可快速构建基于 Java 的实时双向通信应用。

相关推荐
小的~~5 分钟前
ThreadLocal 、InheritableThreadLocal 与 TransmittableThreadLocal 的进阶指南
java·开发语言
北极糊的狐16 分钟前
钉钉小程序报错data.formatTime is not a function是因为 axml 模板中不能直接调用 Page 内自定义方法!
java·小程序·钉钉
·薯条大王9 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
caimouse11 小时前
TDI (传输驱动接口 Transport Driver Interface) 详细分析
网络协议
ZJH__GO12 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆13 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光13 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林13 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu14 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
shengnan_wsn15 小时前
【协议】【TCP】
网络·网络协议·tcp/ip