java websocket服务端丢消息

文章讨论了客户端和服务端基于WebSocket的交互中,因消息处理延迟导致的心跳检测超时关闭session的问题。提出在业务层添加ack机制以确保消息发送成功。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  前提:客户端和服务端基于websocket进行交互,客户端每隔8s发送心跳,服务端检测心跳,超过三分钟没收到会关闭session。
  现象:客户端日志记录发送了心跳消息,服务端没收到心跳,超时后服务端关闭sessionA,客户端新建了会话sessionB,过了会又收到了之前sessionA的消息,由于sessionA已经关闭,所以isOpen 方法返回 false。
  最开始并没有关注到sessionA在关闭后收到的消息,所以一直以为是丢消息了,服务端说是客户端的问题,客户端说明明发送了消息,日志都记录了。
  当然现有消息交互方式也是有问题的,客户端记录发送成功,并不表明真的成功了,所以靠谱的应该是加上业务层的ack,客户端收到服务端的业务ack才真正的是表明消息发送成功了。现在介绍为什么会出现上面的现象。
  客户端跟服务端是单会话形式,所以被@OnMessage标注的方法会依次触发,什么意思?客户端A往服务端发送了1、2、3三个消息,服务端先处理1、处理完之后才会处理2,然后是3。当然了,session之间是并发的,互不影响,只是session内消息是一条一条执行。问题就在这,如果消息1执行很慢,时间超过3分钟,而心跳消息2、3…由于得不到处理就会触发超时关闭session。
  结论:消息并没有丢,而是由于消息处理时间太久,导致后续消息得不到执行,程序判断心跳超时 关闭了session。原因找到了,怎么处理就比较容易了。

Java中的WebSocket是一种网络通信协议,它提供了服务器和客户端之间全双工(双向)的通信能力。使用WebSocket协议,服务端可以实时地向客户端推送消息,而不需要客户端先发起请求。这使得它可以用于实现实时应用,如聊天系统、在线游戏、实时监控等。 在Java中,使用WebSocket服务端消息实时推送通常涉及到以下几个步骤: 1. 创建WebSocket服务器:可以使用Java EE的Servlet API,或者使用更高级的库如Spring Framework的Spring WebSocket。 2. 定义WebSocket端点:这通常是通过注解`@ServerEndpoint`来实现的,在这个端点上定义了客户端连接、消息接收、消息发送和会话关闭等事件的处理方法。 3. 管理连接会话:每个WebSocket连接都是一个会话,服务器端可以通过会话对象向客户端发送消息。 4. 消息推送:通过会话对象的`sendMessage`方法,可以将消息实时推送给客户端。 下面是一个简单的示例代码,展示了如何在Java中使用WebSocket进行消息推送: ```java import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; @ServerEndpoint("/websocket") public class WebSocketServer { private static final Set<Session> sessions = new CopyOnWriteArraySet<>(); @OnOpen public void onOpen(Session session) { sessions.add(session); System.out.println("新连接:" + session.getId()); } public void sendMessage(String message) { for (Session session : sessions) { try { if (session.isOpen()) { session.getBasicRemote().sendText(message); } } catch (IOException e) { e.printStackTrace(); } } } } ``` 在这个例子中,`@ServerEndpoint("/websocket")`标记了WebSocket服务端点,当客户端连接时,`onOpen`方法会被调用,并将新的会话加入会话集合中。`sendMessage`方法则用于向所有连接的客户端推送消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值