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