Websocket保证接收消息完整性

Posted Hello

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Websocket保证接收消息完整性相关的知识,希望对你有一定的参考价值。

用springboot起了个websocket服务端,有时候客户端发来的消息过长,无法接收完整,需要进行额外的处理

 

下面是处理的例子:

@ServerEndpoint("/websocket")
public class WebSocket 
    
    @OnMessage
    public void onMessage(Session session, byte[] message, boolean last) 
        if (last) 
            // 这是完整的消息,可以进行处理
            String text = decodeMessage(message);
            System.out.println("接收到完整的消息:" + text);
         else 
            // 还需要接收后续消息片段
            ByteBuffer buffer = ByteBuffer.allocate(message.length);
            buffer.put(message);
            session.getUserProperties().put("message", buffer);
        
    
    
    private String decodeMessage(byte[] message) 
        // 在这里进行消息解码,返回解码后的字符串
        // 例如:假设消息是UTF-8编码的字符串,可以这样解码
        return new String(message, StandardCharsets.UTF_8);
    
    

    

 

@OnMessage这也可以这样:

    @OnMessage
    public void onMessageContinued(Session session, byte[] message, boolean last) 
        ByteBuffer buffer = (ByteBuffer) session.getUserProperties().get("message");
        buffer.put(message);
        
        if (last) 
            // 这是完整的消息,可以进行处理
            String text = decodeMessage(buffer.array());
            System.out.println("接收到完整的消息:" + text);
            session.getUserProperties().remove("message");
        
    

 

如果是完整的消息,直接进行处理;如果是消息的一部分,则缓存起来等待后续片段的到来

 

MQ怎么保证消息的稳定性和完整性?

业务说明:

  某业务操作完成后,需要发送通知给其他人,比如,单据审批后,需要发送通知给下一审批人(张三),和单据提交人

 

情况分析:

  1.业务操作完成后,调用mq发送消息失败,mq无法连接---发送问题

      2.mq发送了,但消费者接收失败,没有接收,或者接收服务挂了 -----接收问题

      3.消息的延迟性,如说明中的的审批情况,可能 张三 都已经处理了,但这条通知消息因为某种原因迟迟没有发出,导致最后收到过期的消息-----消息过期问题

  

方案:

  根据如下图,解决1、2情况,情况3由消费者自己处理

     技术分享

以上是关于Websocket保证接收消息完整性的主要内容,如果未能解决你的问题,请参考以下文章

MQ怎么保证消息的稳定性和完整性?

Websockets 消息完整性

SpringBoot实现WebSocket发送接收消息 + Vue实现SocketJs接收发送消息

IOError:无法接收 websocket 消息

RabbitMQ消息确认机制—消息发送确认和 消息接收确认

Spring和Java中的Websocket