websocket实现,在线人数统计,给指定用户发送消息,后台实时禁言用户,(永久禁言)

实现思路

1,给用户表添加一个标识字段,用来表示是否被禁言
2,每个用户在建立连接的的时候(onOpen),将每个用户所对应的对象存入ConcurrentHashMap内,key设置为,(或者其他的唯一约束)。用户id+直播房间号,并将用户的是否被禁言状态存入全局变量中。
3,在发送消息(onMessage)判断用户是否被禁言,是则,不发消息。
5,单独写一个针对后台操作直播的controller,传参:userId和liveID
4,在service层,修改user表的禁言状态,然后关闭socket

引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

配置

@Configuration
public class WebSocketConfig {

    /**
     * ServerEndpointExporter 作用
     * <p>
     * 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
     *
     * @return
     */
    @Bean
    public ServerEn
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WebSocket 中,要将消息发送指定用户,可以使用一个 Map 来保存每个连接对应的用户信息。当需要向某个用户发送消息时,可以通过该用户的 ID 查找到对应的 WebSocket 连接,然后将消息发送给该连接。 下面是一个简单的 Java 代码示例,演示了如何实现 WebSocket 发送消息指定用户的功能: ```java import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; @ServerEndpoint("/websocket") public class MyWebSocket { // 保存每个连接对应的用户信息 private static Map<String, Session> clients = new HashMap<String, Session>(); @OnOpen public void onOpen(Session session) { // 获取客户端传来的用户 ID String userId = session.getRequestParameterMap().get("userId").get(0); // 将连接存储到 clients 中,以便后续使用 clients.put(userId, session); } @OnClose public void onClose(Session session) { // 获取客户端传来的用户 ID String userId = session.getRequestParameterMap().get("userId").get(0); // 将连接从 clients 中移除 clients.remove(userId); } @OnMessage public void onMessage(String message, Session session) throws IOException { // 获取客户端传来的用户 ID 和消息内容 String userId = session.getRequestParameterMap().get("userId").get(0); String content = message; // 如果消息内容中包含了目标用户的 ID,则将消息发送给目标用户 int index = content.indexOf(":"); if (index != -1) { String targetUserId = content.substring(0, index); String msg = content.substring(index + 1); Session targetSession = clients.get(targetUserId); if (targetSession != null) { // 如果目标用户在线,则直接发送消息 targetSession.getBasicRemote().sendText(msg); } else { // 如果目标用户在线,则将消息保存到数据库或者消息队列中,等待用户上线后再发送 saveMessageToDatabase(targetUserId, msg); } } else { // 如果消息内容中不包含目标用户的 ID,则将消息发送给所有在线用户 for (Session client : clients.values()) { client.getBasicRemote().sendText(userId + ": " + content); } } } private void saveMessageToDatabase(String targetUserId, String message) { // 将消息保存到数据库或者消息队列中 } } ``` 在上面的代码中,`clients` 是一个静态的 Map,用于保存每个连接对应的用户信息。在 `onOpen` 方法中,我们获取客户端传来的用户 ID,并将该连接存储到 `clients` 中。在 `onClose` 方法中,我们将该连接从 `clients` 中移除。在 `onMessage` 方法中,我们获取客户端传来的消息内容,并根据消息内容中是否包含目标用户的 ID 来判断是否需要将消息发送指定用户。当目标用户在线时,我们直接将消息发送给该用户;当目标用户在线时,我们可以将消息保存到数据库或者消息队列中,等待用户上线后再发送。 需要注意的是,在实际应用中,我们可能需要使用一些高级的消息队列或者分布式缓存来保存消息,以便在多台服务器之间共享消息。此外,我们还需要考虑消息的安全性,比如对用户身份进行验证等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值