基于spring boot+nettey-socket实现长连接消息实时推送

gradle导入相关包:

compile group: 'com.corundumstudio.socketio', name: 'netty-socketio', version: '1.7.7'

消息监听类

import org.springframework.context.annotation.Configuration;
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.annotation.WebListener;

@Configuration 
@WebListener 
public class SocketioLisener implements ServletContextListener { 

@Autowired 
private Socketio socketio;
@Override
public void contextInitialized(ServletContextEvent sce) {
    //启动Socketio服务
    socketio.startServer();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
    //关闭Socketio服务
    Socketio socketio = new Socketio();
    socketio.stopSocketio();
}

}

事件定义类

import com.corundumstudio.socketio.Configuration; 
import com.corundumstudio.socketio.SocketIOClient; 
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.ConnectListener; 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.stereotype.Component; 
import org.springframework.stereotype.Service;
import java.util.Collection;

@Service 
public class Socketio { 
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Value("${socket.server.host}")
private String host;

@Value("${socket.server.port}")
private int port;

private static SocketIOServer socketIOServer;

/**
 * @Title: startSocketio
 * @Description: 创建服务添加客户端
 */
public void startSocketio() {

    // 配置
    Configuration conf = new Configuration();
    // 指定要主机ip地址,这个和页面请求ip地址一致
    conf.setHostname(host);
    // 指定端口号
    conf.setPort(port);

    socketIOServer = new SocketIOServer( conf );

    ConnectListener connect = new ConnectListener() {
        @Override
        public void onConnect( SocketIOClient client ) {
            logger.info("客户端连接成功,sessionId={}",client.getSessionId());
            client.sendEvent("helloPush", "hello");
        }
    };
    // 添加客户端
    socketIOServer.addConnectListener( connect );
    socketIOServer.start();
}

/**
 * @Description: 全体消息推送
 * @param type
 *  前台根据类型接收消息,所以接收的消息类型不同,收到的通知就不同 推送的事件类型
 * @param content
 *  推送的内容
 */
public void pushMessage( String type, Object content ) {

    // 获取全部客户端
    Collection<SocketIOClient> allClients = socketIOServer.getAllClients();
    for( SocketIOClient socket : allClients ) {
        socket.sendEvent( type, content );
        logger.info("Socket推送消息成功 sessionId={},事件名称=={},message={}",socket.getSessionId(),type,content);
    }
}

/**
 * @Title: startServer
 * @Description: 启动服务
 */
public void startServer() {
    if( socketIOServer == null ) {
        new Thread( new Runnable() {

            @Override
            public void run() {

                startSocketio();
            }
        } ).start();
    }
}

/**
 * 暂时不用
 * @Title: stopSocketio
 * @Description: 停止服务
 */
public void stopSocketio() {
    if( socketIOServer != null ) {
        socketIOServer.stop();
        socketIOServer = null;
    }
}
}

业务类调用[全体消息推送]

try {
    Socketio socketio = new Socketio();
    //这里发送的消息内容可以结合具体场景自定义对象
    String message =  "下午2点开大会啦";
    socketio.pushMessage("mining_msg", message);
} catch (Exception e) {
    logger.error("后推送即时消息失败,e={}",e);
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容