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 的实时双向通信应用。

相关推荐
小bo波18 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯19 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
王二端茶倒水1 天前
从千兆到万兆:宽带运营不能只卖套餐,要管用户生命周期从千兆到万兆:宽带运营需要管理用户生命周期
后端·网络协议·架构
SamDeepThinking1 天前
裁掉那个差程序员后,给你看团队里高手的代码:这个习惯,希望你有
java·后端·程序员
朕瞧着你甚好1 天前
技术雷达 & Java 集成评估报告 — Apache Tika 3.3.1
java·ai编程
MacroZheng1 天前
短短几天,暴涨2.8万Star!又一款编程神器开源!
java·人工智能·后端
SamDeepThinking1 天前
函数式编程:用BiFunction消除多类型分支的代码重复
java·后端·面试
Flittly2 天前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了2 天前
Java 生成二维码解决方案
java·后端