如何指定服务器发送套接字消息?

时间:2020-09-10 15:01:57

标签: spring-boot socket.io

我目前正在构建一个Spring Boot服务,该服务仅将消息发送到指定的服务器。

我当前的代码如下。

@Service(value = "socketIOService")
public class SocketIOServiceImpl implements ISocketIOService {

private static final Map<String, SocketIOClient> clientMap = new ConcurrentHashMap<>();

private static final String PUSH_DATA_EVENT = "push_data_event";

@Autowired
private SocketIOServer socketIOServer;

@PostConstruct
private void autoStartup() {
    start();
}

@PreDestroy
private void autoStop() {
    stop();
}

@Override
public void start() {
    // Listen for client connections
    socketIOServer.addConnectListener(client -> {
        System.out.println("************ Client: " + getIpByClient(client) + " Connected ************");
        // Custom Events `connected` -> communicate with clients (built-in events such as Socket.EVENT_CONNECT can also be used)
        client.sendEvent("connected", "You're connected successfully...");
        String userId = getParamsByClient(client);
        if (userId != null) {
            clientMap.put(userId, client);
        }
    });

    // Listening Client Disconnect
    socketIOServer.addDisconnectListener(client -> {
        String clientIp = getIpByClient(client);
        System.out.println(clientIp + " *********************** " + "Client disconnected");
        String userId = getParamsByClient(client);
        if (userId != null) {
            clientMap.remove(userId);
            client.disconnect();
        }
    });

    // Custom Event`client_info_event` ->Listen for client messages
    socketIOServer.addEventListener(PUSH_DATA_EVENT, String.class, (client, data, ackSender) -> {
        // When a client pushes a `client_info_event` event, onData accepts data, which is json data of type string here and can be Byte[], other types of object
        String clientIp = getIpByClient(client);
        System.out.println(clientIp + " ************ Client:" + data);
    });

    socketIOServer.start();

    new Thread(() -> {
        while (true) {
            try {
                // Send broadcast message every 3 seconds
                Thread.sleep(3000);
                socketIOServer.getBroadcastOperations().sendEvent("myBroadcast", "Broadcast message ");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

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

@Override
public void pushMessageToUsers(String msgContent) {
    for (String key : clientMap.keySet()) {

        SocketIOClient client = clientMap.get(key);
        if (client != null) {
            client.sendEvent(PUSH_DATA_EVENT, msgContent);
        }
    }
}

private String getParamsByClient(SocketIOClient client) {
    // Get the client url parameter (where userId is the unique identity)
    Map<String, List<String>> params = client.getHandshakeData().getUrlParams();
    List<String> userIdList = params.get("userId");
    if (!CollectionUtils.isEmpty(userIdList)) {
        return userIdList.get(0);
    }
    return null;
}

private String getIpByClient(SocketIOClient client) {
    String sa = client.getRemoteAddress().toString();
    return sa.substring(1, sa.indexOf(":"));
}

}

这段代码来自enter link description here,我尝试阅读说明,但它们大多在中国....所以我无法解释。

是否有任何建议限制和指定服务器以代码形式发送消息?

我想使用application.yml指定服务器来发送消息。

您的建议将不胜感激。

0 个答案:

没有答案
相关问题