【问题标题】:Send message to single client in tomcat websockets在tomcat websockets中向单个客户端发送消息
【发布时间】:2014-04-06 08:22:09
【问题描述】:

在 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”发送消息。
我认为 for 循环必须改变。
如何仅向“Guest1”发送消息。

【问题讨论】:

  • 你有没有尝试过这样做?
  • @endriu_l 是的,我试过但每次都失败
  • 好的...那么问题出在哪里?您有一个循环,将消息一一发送给每个人,只需选择一个客户并将消息仅发送给他
  • @endriu_l 这样的循环怎么写
  • 但是你已经拥有它了...在broadcast方法中

标签: java tomcat websocket tomcat7 java-ee-7


【解决方案1】:

将连接从集合转换为地图:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 2022-07-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    相关资源
    最近更新 更多