【发布时间】:2017-08-05 21:45:15
【问题描述】:
我想通过网络套接字向特定用户发送消息。到目前为止,我可以像这样打开一个 Web 套接字并从客户端读取消息:
@ServerEndpoint(value = "/wsep")
public class WebSocketEndpoint {
private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketEndpoint.class);
private Session session;
@OnOpen
public void onOpen(Session session) {
this.session = session;
try {
session.getBasicRemote().sendText("You are connected. Your ID is " + session.getId());
} catch (Exception e) {
LOGGER.error("Error on open web socket", e);
}
}
@OnMessage
public void onClientMessage(String message, Session session) {
LOGGER.info("Message from {} is: {}", session.getId(), message);
}
@OnClose
public void onClose(Session session) {
this.session = null;
LOGGER.info("{} disconnected", session.getId());
}
}
我有一个独立的服务,可以在目的地向用户创建消息。我的Message 类是一个简单的 POJO:
public class Message {
private String fromUserName;
private String toUserName;
private String content;
...
}
当在我的MessageService 中创建新消息时,我想通知接收者是否已连接。我想我必须添加一个方法WebSocketEndpoint.onServerMessage:
public void onServerMessage(Session session, Message message) {
session.getBasicRemote().sendText(message.getContent());
}
但我不知道如何做这样行得通的事情。
【问题讨论】:
-
看来你的实现是错误的。您应该使用静态映射来存储密钥为 id 的会话,或者可以是引用/标识符。 - 当客户端连接时,将其会话存储到映射。 - 当客户端关闭时,从地图中删除其会话。 - 创建新消息时,通过 id 查找并使用该会话发送消息。