簡體   English   中英

如何在java websocket上線后發送離線用戶的消息?

[英]How to send messages of offline user after getting online in java websocket?

我正在嘗試使用webcocket編寫聊天,對於已使用java Queue的離線用戶,如果用戶處於離線狀態我將消息保留在隊列中,當用戶上線時我檢查隊列是否為空,如果不是,則使用循環我刪除來自Queue的每條消息。 問題是它只是向用戶發送最后一條消息,即使所有消息都在隊列中,這是我的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條消息。 我知道這很少見,但根據你的代碼應該是這樣的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM