将消息发送到 tomcat websockets 中的单个客户端



在tomcat-8的例子中,我看到了一个使用HTML5网络套接字的聊天示例。

代码如下所示

public class ChatAnnotation {
private static final Log log = LogFactory.getLog(ChatAnnotation.class);
private static final String GUEST_PREFIX = "Guest";
private static final AtomicInteger connectionIds = new AtomicInteger(0);
private static final Set<ChatAnnotation> connections =
        new CopyOnWriteArraySet<>();
private final String nickname;
private Session session;
public ChatAnnotation() {
    nickname = GUEST_PREFIX + connectionIds.getAndIncrement();
}

@OnOpen
public void start(Session session) {
    this.session = session;
    connections.add(this);
    String message = String.format("* %s %s", nickname, "has joined.");
    broadcast(message);
}

@OnClose
public void end() {
    connections.remove(this);
    String message = String.format("* %s %s",
            nickname, "has disconnected.");
    broadcast(message);
}



    @OnMessage
          public void incoming(String message) {
       // Never trust the client
        String filteredMessage = String.format("%s: %s",
            nickname, HTMLFilter.filter(message.toString()));
         broadcast(filteredMessage);
    }

 private static void broadcast(String msg) {
      for (ChatAnnotation client : connections) {
          try {
              synchronized (client) {
                  client.session.getBasicRemote().sendText(msg);
              }
          } catch (IOException e) {
              log.debug("Chat Error: Failed to send message to client", e);
              connections.remove(client);
              try {
                  client.session.close();
              } catch (IOException e1) {
                // Ignore
             }
              String message = String.format("* %s %s",
                     client.nickname, "has been disconnected.");
             broadcast(message);
           }
      }
  }
  }

此代码向连接到服务器 的所有客户端发送消息。
但我只想向"Guest1"发送消息。
我认为循环必须改变。
如何仅向"来宾 1"发送消息。

将集合中的连接转换为映射:

ConcurrentHashMap< String, ChatAnnotation> connections = new ConcurrentHashMap<>(); 

保留用户或任何标识符,您必须将用户标识为映射中的键。它们使用广播方法中的用户密钥从映射中获取连接对象,并仅向该用户发送消息,而不是遍历所有连接对象。

相关内容

  • 没有找到相关文章

最新更新