java - java websocket 上线后如何发送离线用户的消息?

标签 java websocket java-websocket

我正在尝试使用 webcocket 编写聊天,对于离线用户,我使用了 java 队列,如果用户离线,我将消息保存在队列中,当用户在线时,我检查队列是否为空,如果不是,则使用循环我从队列中删除每条消息。问题是它只是向用户发送最后一条消息,即使所有消息都在队列中, 这是我的 onOpen 方法:

@ServerEndpoint(value = "/chat/{room}/{user}", encoders = ChatMessageEncoder.class, decoders = ChatMessageDecoder.class)
 public class ChatEndpoint {


private final Logger log = Logger.getLogger(getClass().getName());
private static final Map<String, Queue<ChatMessage>> userMessageBuffer = new HashMap<>();

@OnOpen
public void open(final Session session,
        @PathParam("room") final String room,
        @PathParam("user") final String userId) {

    log.info("session openend and bound to room: " + room);
    // session.getUserProperties().put("room", room);
    session.getUserProperties().put("user", userId);

    Queue<ChatMessage> userMsgs = userMessageBuffer.get(userId);
    ChatMessage sendChat = new ChatMessage();

    if (userMsgs != null && !userMsgs.isEmpty()) {

        for (int i = 0; i < userMsgs.size(); i++) {

            sendChat = userMsgs.remove();
            System.out.println("size!!!!!! " + sendChat.getMessage());
            try {

                    session.getBasicRemote().sendObject(sendChat);

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (EncodeException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

}}

谁知道问题出在哪里?

最佳答案

完整代码我没有查,但是肯定是

      for (int i = 0; i < userMsgs.size(); i++)

是你的问题。因为您正在使用 i++ 并检查 userMsgs.size() 作为 for 循环中的条件。因此,您将 i 增加 1 并将 userMsgs 大小减少 1,实际上您将只能访问队列中一半的元素。

假设队列中有 8 个元素,最初(想象一下 Admiral General Aladeen 解释圆形导弹)

               i=0 and userMsgs.size()=8
               i=1 and userMsgs.size()=7
               i=2 and userMsgs.size()=6
               i=3 and userMsgs.size()=5
               i=4 and userMsgs.size()=4 // comes out of loop.

你应该使用 while 循环,

  while(!userMsgs.isEmpty()){
   .....
  }

您说您只能向用户发送最后一条消息,可能是因为队列中只有 2 条消息。我知道这种情况很少见,但根据您的代码应该是这种情况。

关于java - java websocket 上线后如何发送离线用户的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31266323/

相关文章:

java - 在java中删除随机访问文件

java - 枚举传递多个字段值?

python - 使用 Django Channels 将信息发送到所有连接的客户端

http - 使用 HTTP keep-alive 和 websockets (socket.io) 时的 TCP 连接数

java - Jetty WebSocketException 无法调用方法

java - spring-websockets 如何在打开的连接上发送参数

java - 通过将元素移动到末尾来从数组中删除重复项

java - 我可以向 Java 中的枚举添加函数吗?

java - 是否可以在原生 Android 应用程序中使用 WebSockets 或类似的?

java - 在 Java 中如何关闭 WebSocketContainer/WebSocketClient/Jetty 客户端?