spring-boot - 如何指定服务器发送 Socket 消息?
问题描述
我目前正在构建一个仅向指定服务器发送消息的 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(":"));
}
}
此代码来自此处的输入链接描述,我尝试阅读说明,但它们大多在中国......所以我无法解释。
有什么建议限制和指定服务器以代码形式发送消息吗?
我想使用 application.yml 来指定服务器发送消息。
您的建议将不胜感激。
解决方案
推荐阅读
- java - 在 KeyVaultClient java 中将代理设置为 AuthenticationContext 无效
- javascript - 如何使用 mailapp 发送图像和图表?
- python - 为骰子游戏和猜数字游戏添加投注功能
- javascript - 如何确定我在页面的哪个部分以反映在我的导航栏上?
- typescript - 接口的处理方式与等效对象不同
- javascript - 为什么按钮 onclick 在数据表服务器端不起作用?拉拉维尔 6
- sql - 如何在 T-SQL 中选择具有最大值的列?
- python - VPython 不适用于 Mac 版 Spyder 3.3.6
- reactjs - componentDidUpdate 不断触发或从不触发
- c# - 如何使用 SignalR 显示来自 REST API 的实时数据?