首页 > 其他分享 >Websocket保证接收消息完整性

Websocket保证接收消息完整性

时间:2023-04-06 20:56:37浏览次数:35  
标签:Websocket buffer text session 完整性 消息 ByteBuffer message 接收

用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");
        }
    }

 

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

 

标签:Websocket,buffer,text,session,完整性,消息,ByteBuffer,message,接收
From: https://www.cnblogs.com/Hello233/p/17294124.html

相关文章

  • java后端接收Request请求参数方式
    1.直接在Controller方法参数上配置参数名@RequestMapping("/method01")publicStringmethod01(Stringname,Integerage,Doublemon){Useruser=newUser();user.setName(name);user.setAge(age);user.setMoney(mon);......
  • go语言发送请求后接收到json如何提取其中指定参数
    由于用过python的缘故,一开始想着直接取后来发现并不行,于是上网查找资料发现需要定义结构体绑定参数,后来定义完结构体后发现并没有解决问题,而且过程较为繁琐,于是想着先将接收到的数据转为字符串body,_:=io.ReadAll(response.Body)fmt.Println(string(body))利用上面的代码发......
  • WebSocket 实战之——【WebSocket 原理】
    一、WebSocket是什么?HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)。    首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了......
  • 全面理解WebSocket与Socket、TCP、HTTP的关系及区别
    6.WebSocket和SocketSocket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。 Socket本身并不是一个协议,它工作在OSI模型会话层,是一个套接字,TCP/IP网络的API,是为了方便大家直接使用。更底层协议而存在的一个抽象层。S......
  • php-websocket hyperf/websocket-server/client 客户端和服务器实时双向数据传输
    WebSocket服务WebSocket是一种通信协议,可在单个TCP连接上进行全双工通信。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocketAPI中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。Hyperf......
  • swoft 客服系统websocket。即时通讯小功能
     挥手,握手就不解释了。直接上代码启动swoftws的服务  <?phpdeclare(strict_types=1);/***ThisfileispartofSwoft.**@linkhttps://swoft.org*@documenthttps://swoft.org/docs*@[email protected]*@licensehttps://github.co......
  • swoole+websocket+redis实现一对一聊天
     如同web端的QQ和微信一样,这是一个web端的聊天程序。环境:linux(centos)+php7.2+swoole扩展+redis+mysqlRedis实现每个连接websocket的服务都唯一绑定一个用户。通过用户账号=websocketfd存到redis中。Mysql实现离线消息池。如果一个用户不在线,则其他用户发......
  • vue3路由跳转params传参接收不到
      这样路由可以跳转过去,但接收到了params是一个空对象。 解决方法由于之前的params传参在页面刷新之后,参数会丢失,所以vue将这种方法移除了。vue推荐的路由跳转传参方法:1.使用query传递参数2.使用vuex、pinia对参数进行存储3.使用HistoryAPI方式传递和接收  ......
  • Python邮件发送接收实战
    一、电子邮件Email的历史比Web还要久远,直到现在,Email也是互联网上应用非常广泛的服务。几乎所有的编程语言都支持发送和接收电子邮件,但是,先等等,在我们开始编写代码之前,有必要搞清楚电子邮件是如何在互联网上运作的。我们来看看传统邮件是如何运作的。假设你现在在北京,要给一个香港......
  • vue+webSocket+springCloud消息推送交互
    一、后台代码:1、pom里面加上依赖;<!--webSocket坐标依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.2.4.RE......