[英]How to send and recive messages from JS WebSocket to Java Server?
[英]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.