springboot 集成netty-socketio 在線聊天

首先引入jar

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

配置文件

socketio:
  host: 0.0.0.0
  port: 999
  maxFramePayloadLength: 1048576
  maxHttpContentLength: 1048576
  bossCount: 1
  workCount: 100
  allowCustomRequests: true
  upgradeTimeout: 1000000
  pingTimeout: 6000000
  pingInterval: 25000

配置

@Configuration
public class SocketIOConfig {

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

    @Value("${socketio.port}")
    private Integer port;

    @Value("${socketio.bossCount}")
    private int bossCount;

    @Value("${socketio.workCount}")
    private int workCount;

    @Value("${socketio.allowCustomRequests}")
    private boolean allowCustomRequests;

    @Value("${socketio.upgradeTimeout}")
    private int upgradeTimeout;

    @Value("${socketio.pingTimeout}")
    private int pingTimeout;

    @Value("${socketio.pingInterval}")
    private int pingInterval;

    /**
     * 以下配置在上面的application.properties中已經註明
     * @return
     */
    @Bean
    public SocketIOServer socketIOServer() {
        SocketConfig socketConfig = new SocketConfig();
        socketConfig.setTcpNoDelay(true);
        socketConfig.setSoLinger(0);
        com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration();
        config.setSocketConfig(socketConfig);
        config.setHostname(host);
        config.setPort(port);
        config.setTransports(Transport.POLLING, Transport.WEBSOCKET);
        config.setBossThreads(bossCount);
        config.setWorkerThreads(workCount);
        config.setAllowCustomRequests(allowCustomRequests);
        config.setUpgradeTimeout(upgradeTimeout);
        config.setPingTimeout(pingTimeout);
        config.setPingInterval(pingInterval);
        return new SocketIOServer(config);
    }
}
創建接口

public interface  SocketIOService {
    //推送的事件
    public static final String PUSH_EVENT = "pushmessage";

    // 啓動服務
    void start() throws Exception;

    // 停止服務
    void stop();

    // 推送信息
    void pushMessageToUser(PushMessage pushMessage);
}

 


@Service(value = "socketIOService")
public class SocketIOServiceImpl implements SocketIOService {
// 用來存已連接的客戶端
private static Map<String, Chat> clientMap = new ConcurrentHashMap<>();

@Autowired
private SocketIOServer socketIOServer;
@PostConstruct
private void autoStartup() throws Exception {
    start();
@Override
public void start() {
    // 監聽客戶端連接
    socketIOServer.addConnectListener(client -> {
      PushMessage push = new PushMessage();
     push.setContent(bu.getBusinessName()+"加入");
client .sendEvent(PUSH_EVENT, push);//如果給其他用戶發。存到client中。然後循環

 


        }
    });

    // 監聽客戶端斷開連接
    socketIOServer.addDisconnectListener(client -> {
       
        
 PushMessage push = new PushMessage();
     push.setContent(bu.getBusinessName()+"加入");
client .sendEvent(PUSH_EVENT, push);//如果給其他用戶發。存到client中。然後循環


    });

    // 處理自定義的事件,與連接監聽類似
    socketIOServer.addEventListener(PUSH_EVENT, PushMessage.class, (client, data, ackSender) -> {
       //收到的消息自行處理



    });
    socketIOServer.start();
}

@Override
public void stop() {
    if (socketIOServer != null) {
        socketIOServer.stop();
        socketIOServer = null;
    }
}

@Override
public void pushMessageToUser(PushMessage pushMessage) {
  //推送消息
}



/**
 * Spring IoC容器在銷燬SocketIOServiceImpl Bean之前關閉,避免重啓項目服務端口占用問題
 * @throws Exception
 */
@PreDestroy
private void autoStop() throws Exception  {
    stop();
}

}

PushMessage 只是一個簡單的對象。可以跟進業務自己創建

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章