首页 > 其他分享 >SocketIO推送连接后,收不到服务端推送数据问题分析

SocketIO推送连接后,收不到服务端推送数据问题分析

时间:2024-08-05 15:59:11浏览次数:11  
标签:socket socketio SocketIO corundumstudio import 推送 com public 服务端

重点需要注意前端和后端的SocketIO的版本,socketio在2.0.x才开始支持4.0协议。

可以看https://mvnrepository.com/artifact/com.corundumstudio.socketio/netty-socketio,引用最新版本。

<dependency>
    <groupId>com.corundumstudio.socketio</groupId>
    <artifactId>netty-socketio</artifactId>
    <version>2.0.11</version>
</dependency>

服务端代码:

import lombok.Data;

@Data
public class Message {

    private String senderName;
    private String targetUserName;
    private String message;



}

import javax.annotation.PreDestroy;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.ConnectListener;
import com.corundumstudio.socketio.listener.DisconnectListener;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.CrossOrigin;

@CrossOrigin
@Component
@Slf4j
public class SocketIOConfig {

    @Value("${socket.host}")
    private String SOCKETHOST;
    @Value("${socket.port}")
    private int SOCKETPORT;
    private SocketIOServer server;

    @Bean
    public SocketIOServer socketIOServer() {
        Configuration config = new Configuration();
        config.setHostname(SOCKETHOST);
        config.setPort(SOCKETPORT);
        server = new SocketIOServer(config);
        server.start();
        server.addConnectListener(new ConnectListener() {
            @Override
            public void onConnect(SocketIOClient client) {

                log.info("new user connected with socket " + client.getSessionId());
            }
        });
        server.addDisconnectListener(new DisconnectListener() {
            @Override
            public void onDisconnect(SocketIOClient client) {
                client.getNamespace().getAllClients().stream().forEach(data-> {
                    log.info("user disconnected "+data.getSessionId().toString());});
            }
        });
        return server;
    }

    @PreDestroy
    public void stopSocketIOServer() {
        this.server.stop();
    }

}
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.ConnectListener;
import com.corundumstudio.socketio.listener.DataListener;
import com.corundumstudio.socketio.listener.DisconnectListener;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
@Log4j2
public class SocketIOController {

    @Autowired
    private static SocketIOServer socketServer;

    public static SocketIOServer getSocketIOServer(){
        return socketServer;
    }

    SocketIOController(SocketIOServer socketServer){
        this.socketServer=socketServer;

        this.socketServer.addConnectListener(onUserConnectWithSocket);
        this.socketServer.addDisconnectListener(onUserDisconnectWithSocket);

        this.socketServer.addEventListener("替换内容", Message.class, onSendMessage);

    }


    public ConnectListener onUserConnectWithSocket = new ConnectListener() {
        @Override
        public void onConnect(SocketIOClient client) {
            log.info("Perform operation on user connect in controller");
        }
    };


    public DisconnectListener onUserDisconnectWithSocket = new DisconnectListener() {
        @Override
        public void onDisconnect(SocketIOClient client) {
            log.info("Perform operation on user disconnect in controller");
        }
    };

    public DataListener<Message> onSendMessage = new DataListener<Message>() {
        @Override
        public void onData(SocketIOClient client, Message message, AckRequest acknowledge) throws Exception {

            log.info(message.getSenderName()+" user send message to user "+message.getTargetUserName()+" and message is "+message.getMessage());

            socketServer.getBroadcastOperations().sendEvent("替换内容",message);

        }
    };

}

前端测试代码如下:

<!DOCTYPE html>
<html>
<head>
    <title>长时间任务</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/socket.io/4.7.5/socket.io.js"></script>
    <script>
       
       var socket = io('http://localhost:8756', {
        autoConnect: false, // 禁止自动连接
        extraHeaders: {
          'Access-Control-Allow-Origin': '*', // 设置跨域请求头
        },
        transports: ['websocket', 'polling', 'flashsocket'],
      });
        //连接和断开时触发事件
        socket.on('connect', function() {
            console.log('已连接到服务器');
        });  
         socket.on('disconnect', function() {
            console.log('已断开');
        });


        function start() {
            console.log('连接中...'); 
            socket.connect();
        } 
        function stopTask() {
            socket.disconnect();
        } 
        
        //这个用于测试自义定事件
        function test() {
            const data={
                name:'123',
                id:111
            }
            socket.emit('替换内容', data);
        }

        socket.on('event_name', function(data) {
            console.log('后端事件返回值:', data);
        });
    </script>
</head>
<body>
    <button onclick="start()">连接</button>
    <button onclick="stopTask()">断开</button>
    <button onclick="test()">测试前端发一个事件</button>
</body>
</html>

标签:socket,socketio,SocketIO,corundumstudio,import,推送,com,public,服务端
From: https://blog.csdn.net/bobocqu/article/details/140928747

相关文章

  • 邮件推送api接口的功能优势?有哪些特点?
    邮件推送api接口稳定性如何评估?怎么选邮件API接口?企业和组织依赖邮件推送API接口来实现高效、精准的电子邮件发送。邮件推送API接口提供了一系列强大功能,使企业能够更好地与客户沟通,提升业务效率和客户满意度。AokSend将详细探讨邮件推送API接口的功能优势。邮件推送api接口......
  • git本地分支映射远程分支并推送相应代码
    在Git中,克隆仓库默认只会检出`master`分支(或`main`分支,取决于仓库的默认分支配置)。如果你想切换到不同的远程分支,可以按照以下步骤操作:1.**克隆仓库**(如果尚未克隆):```bashgitclone<repository-url>```这将克隆仓库并检出默认分支。2.**查看所有远程分支**:```ba......
  • 基于Java swing + MySQL电影院订票与管理系统,分为客户端和服务端
    一、需求分析电影院购票与管理系统......
  • github添加ssh密钥,通过ssh方式推送代码
    左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。公众号:一点sir,关注领取python编程资料很多人在使用github的时候,如果还是使用https的方式推送代码的话,可能会发现推送不上去,官方会建议你使用ssh的方式进行代码推送。通过ssh方式推送代码,速度更快,更高效,而且还不用......
  • IDEA或Git推送项目到Gitee远程仓库
    新建仓库我的是Java项目,我就选的java创建完毕打开你项目的文件夹,里面若已经有了.git文件可能需要删除,可能会冲突然后初始化gitinit,配置用户名,邮箱,连接远程仓库 gitpulloriginmaster拉取更新一下本地库,此时可能会拉取失败,这时候你要检查你自己的本地库是不是和......
  • 【Nuxt】服务端渲染 SSR
    SSR概述服务器端渲染全称是:ServerSideRender,在服务器端渲染页面,并将渲染好HTML返回给浏览器呈现。SSR应用的页面是在服务端渲染的,用户每请求一个SSR页面都会先在服务端进行渲染,然后将渲染好的页面,返回给浏览器呈现。构建SSR应用常见的库和框架有:VueNuxt,ReactNext......
  • NIS(Network Information Services)服务端在R系部署,客户端rpm,deb简单使用
    #!/bin/bash####@Author:[email protected]#@Date:2024-05-28#@LastEditors:[email protected]#@LastEditTime:2024-07-19#@FilePath:NIS-use.sh#@Description:NIS(NetworkInformationServices)source:https://www.th......
  • 汇川AM401的TCP服务端通信
    VARx建立连接:BOOL;abySendData_0:ARRAY[0..3]OFBYTE:=[76,79,78,13];abyRecvData_0:ARRAY[0..19]OFBYTE;TCP_Server_0:TCP_Server;TCP_Connect_0:TCP_Connect;TCP_Receive_0:TCP_Receive;TCP_Send_0:TCP_Send;iState......
  • HBuilderX 开发中使用 Node.js 搭建PDA扫码程序的服务端过程
    以下是使用HBuilderX和Node.js搭建程序服务端的大致步骤: 1. 安装Node.js首先,从Node.js官方网站下载并安装适合您操作系统的版本。在命令提示符中执行node-v,npm-v,检查nodejs版本是否安装完成。配置环境变量。2. 安装Oracle客户端根据您的操作系统,下载并安......
  • Net8将Serilog日志推送ES,附视频
    这是一个Serilog的实践Demo,包括了区别记录存放,AOP日志记录,EF执行记录,并且将日志推送到ElasticSearch。说在前面的话自从AI出来之后,学习的曲线瞬间变缓了,学习的路径也有了很大的变化。与本人来说以前大多数都先知晓理论再找相关的框架官网或博客,然后去实践Demo,再加入到代码......