Netty Socketio使用

Netty-Socketio使用

1.添加依赖

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

2.配置

2.1 配置 redisson

略,前面有redisson的博文,我介绍过。

2.2 配置socketio的Configuration
public Configuration getConfig(){
    Configuration config = new Configuration();
    config.setHostname("localhost");
    config.setPort(9092);
    InputStream ssl = WebSocketServer.class.getResourceAsStream(jksPath);//证书地址
    config.setPort.setKeyStore(ssl);
    final SocketIOServer server = new SocketIOServer(config);
}
2.3 注册监听器

注册连接监听器与断开监听器

void addListener() {
        socketServer.addConnectListener(new ConnectListener() {
            @Override
            public void onConnect(SocketIOClient socketIOClient) {
                connectThreadPool.submit(new Runnable() {
                    @Override
                    public void run() {
                        HandshakeData handshakeData = socketIOClient.getHandshakeData();
                        // 消息接收方
                        String system = handshakeData.getSingleUrlParam(HandshakeParamsDTO.FROM);
                        socketIOClient.joinRoom(system);
                        // 将用户信息存到缓存
                    }
                });
            }
        });
        socketServer.addDisconnectListener(new DisconnectListener() {
            @Override
            public void onDisconnect(SocketIOClient socketIOClient) {
                disconnectThreadPool.submit(new Runnable() {
                    @Override
                    public void run() {
                        //从缓存删除用户信息
                    }
                });
            }
        });
}
2.4 启动/断开服务
  • 启动socketServer.start();
  • 断开socketServer.stop();
2.5 发消息

单个发送:

public void sendMessageToUser(WebSocketDataDTO message) {
        Packet packet = new Packet(PacketType.MESSAGE);
        packet.setData(message.getMessage());
        String sessionId = redisHelper.getSessionIdOfUser(message); // 从缓存取出用户信息
        if(!StringUtils.isBlank(sessionId)) {
            socketServer.getClient(UUID.fromString(sessionId)).send(packet, new AckCallback<AckResult>(AckResult.class) {
                @Override
                public void onSuccess(AckResult result) {
                }
            });
        }
}

广播发送:

public void sendRoomMessage(WebSocketDataDTO message) {
        if(StringUtils.isBlank(message.getTo())) {
            Packet packet = new Packet(PacketType.MESSAGE);
            packet.setData(message.getMessage());
            socketServer.getRoomOperations(message.getTo()).send(packet);
        }
}