0

0

Java中如何用WebSocket实现实时通信

尼克

尼克

发布时间:2025-06-11 15:36:02

|

801人浏览过

|

来源于php中文网

原创

websocket在java中实现实时通信的解决方案是:1. 使用支持websocket的服务器如tomcat 7.0.47及以上版本;2. 创建websocket端点类并使用@serverendpoint注解指定连接uri;3. 利用@onopen、@onmessage、@onclose和@onerror处理连接事件;4. 部署应用到服务器并通过javascript websocket api实现客户端连接。相比http的请求-响应模式,websocket提供全双工通信,适合实时应用。为处理并发问题,应使用concurrenthashmap等线程安全结构管理会话,并通过wss://协议保障安全性,同时在握手阶段验证身份及来源,防止cswsh攻击。

Java中如何用WebSocket实现实时通信

WebSocket在Java中实现实时通信,简单来说,就是建立一个持久的连接,让服务器可以主动向客户端推送数据,而不用客户端频繁地请求。

Java中如何用WebSocket实现实时通信

解决方案:

Java中如何用WebSocket实现实时通信

首先,你需要一个支持WebSocket的Java服务器。像Tomcat、Jetty或者Undertow都行,它们都内置了WebSocket的支持。以Tomcat为例,你需要Tomcat 7.0.47或更高版本。

立即学习Java免费学习笔记(深入)”;

Java中如何用WebSocket实现实时通信

接下来,创建一个WebSocket端点。这通常涉及创建一个Java类,并使用@ServerEndpoint注解来标记它。这个注解指定了客户端连接到服务器的URI。

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@ServerEndpoint("/websocket")
public class MyWebSocket {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("Client connected: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        System.out.println("Received message: " + message + " from " + session.getId());
        session.getBasicRemote().sendText("Server received: " + message); // Echo back
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("Client disconnected: " + session.getId());
    }

    @OnError
    public void onError(Session session, Throwable error) {
        System.err.println("Error occurred: " + error.getMessage());
    }
}

这个例子中,/websocket是端点URI。@OnOpen@OnMessage@OnClose@OnError注解分别处理连接打开、接收消息、连接关闭和错误事件。

然后,部署你的应用到Tomcat服务器。

在客户端,你可以使用JavaScript的WebSocket API来连接到服务器。

var websocket = new WebSocket("ws://localhost:8080/your-app-name/websocket");

websocket.onopen = function(event) {
  console.log("Connected to WebSocket server");
  websocket.send("Hello from client!");
};

websocket.onmessage = function(event) {
  console.log("Received message: " + event.data);
};

websocket.onclose = function(event) {
  console.log("Disconnected from WebSocket server");
};

websocket.onerror = function(error) {
  console.error("WebSocket error: " + error);
};

这段JavaScript代码创建了一个WebSocket连接,并定义了处理连接打开、接收消息、连接关闭和错误的函数。 记得把ws://localhost:8080/your-app-name/websocket替换成你实际的WebSocket服务器地址。 your-app-name指的是你部署的war包的名字。

ASP.NET 4.0电子商城
ASP.NET 4.0电子商城

在现实生活中的购物过程,购物者需要先到商场,找到指定的产品柜台下,查看产品实体以及标价信息,如果产品合适,就将该产品放到购物车中,到收款处付款结算。电子商务网站通过虚拟网页的形式在计算机上摸拟了整个过程,首先电子商务设计人员将产品信息分类显示在网页上,用户查看网页上的产品信息,当用户看到了中意的产品后,可以将该产品添加到购物车,最后使用网上支付工具进行结算,而货物将由公司通过快递等方式发送给购物者

下载

WebSocket和HTTP有什么区别?

HTTP是请求-响应模式,客户端发起请求,服务器返回响应。WebSocket是全双工的,一旦连接建立,客户端和服务器可以互相发送数据,不需要每次都发起新的请求。HTTP的无状态性在某些场景下是优点,但在实时通信中就显得笨重了。 想象一下,如果聊天应用每次发送消息都要重新建立连接,那体验得多差。WebSocket保持连接,更适合实时应用。

如何处理WebSocket连接中的并发问题?

并发问题是不可避免的,特别是当多个客户端同时连接到服务器时。一个常见的做法是使用线程安全的数据结构来存储WebSocket会话,例如ConcurrentHashMap。 此外,你可能需要使用锁来保护共享资源,避免多个线程同时修改它们。

import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;

public class WebSocketSessionManager {

    private static final Map<String, Session> sessions = new ConcurrentHashMap<>();

    public static void addSession(String sessionId, Session session) {
        sessions.put(sessionId, session);
    }

    public static void removeSession(String sessionId) {
        sessions.remove(sessionId);
    }

    public static Session getSession(String sessionId) {
        return sessions.get(sessionId);
    }

    // 广播消息给所有连接的客户端
    public static void broadcast(String message) {
        sessions.values().forEach(session -> {
            try {
                session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                System.err.println("Error broadcasting message: " + e.getMessage());
            }
        });
    }
}

这个简单的WebSocketSessionManager使用ConcurrentHashMap来存储会话,broadcast方法演示了如何向所有连接的客户端发送消息。注意,异常处理是必不可少的,因为网络连接可能随时中断。

WebSocket的安全性如何保障?

WebSocket本身提供了一些安全机制,比如可以通过wss://协议使用TLS/SSL加密连接,类似于HTTPS。 除了加密,你还需要考虑身份验证和授权。 可以在WebSocket握手阶段进行身份验证,例如使用HTTP头传递token。 一旦连接建立,服务器需要验证客户端是否有权执行特定的操作。 一种常见的做法是,在连接建立后,客户端发送一个包含身份信息的JSON消息,服务器验证该信息,并根据权限设置会话上下文。

此外,还要注意防止WebSocket漏洞,例如跨站WebSocket劫持(CSWSH)。 确保你的服务器只接受来自信任域的WebSocket连接。 可以检查Origin头来验证请求的来源。

总而言之,WebSocket为Java应用带来了实时通信的能力,但你需要仔细考虑并发、安全性和错误处理等问题,才能构建一个健壮的WebSocket应用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

117

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

173

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

170

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

158

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

200

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

244

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

169

2024.02.23

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号