【发布时间】:2018-07-28 20:08:42
【问题描述】:
我对 Java EE 还很陌生,所以如果我的要求对您没有意义,请不要对我苛刻。我按照一些教程来实现 websocket api,基本上创建了两个类。首先是一个看起来像这样的端点类:
public class ChatEndpoint extends Endpoint {
private static final ConcurrentLinkedQueue<Session> peers = new ConcurrentLinkedQueue<>();
private static final Logger LOGGER = Logger.getLogger(ChatEndpoint.class.getName());
@Override
public void onOpen(Session session, EndpointConfig endpointConfig) {
LOGGER.log(Level.INFO, "New session opened");
peers.add(session);
session.addMessageHandler(new MessageHandler.Whole<String>() {
@Override
public void onMessage(String message) {
LOGGER.log(Level.INFO, String.format("Received message: %s", message));
try {
broadcastMessage(message, session);
} catch (IOException e) {
LOGGER.log(Level.SEVERE, null, e);
}
}
});
}
@Override
public void onClose(Session session, CloseReason closeReason) {
LOGGER.log(Level.INFO, String.format("Session closed with reason %s", closeReason.getReasonPhrase()));
}
public void broadcastMessage(String message, Session session) throws IOException {
for (Session peer : peers) {
peer.getBasicRemote().sendText(message);
}
}
}
...和我的配置类:
public class ServerConfig implements ServerApplicationConfig {
@Override
public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> endpointClasses) {
Set<ServerEndpointConfig> results = new HashSet<>();
for (Class endpointClass : endpointClasses) {
if (endpointClass.equals(ChatEndpoint.class)) {
ServerEndpointConfig serverEndpointConfig = ServerEndpointConfig.Builder.create(endpointClass, "/chat").build();
results.add(serverEndpointConfig);
}
}
return results;
}
@Override
public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> endpointClasses) {
return Collections.emptySet();
}
}
现在您可以看到,我采用了程序化方式而不是注释方式来执行此操作。我知道使用注释的部署方式,我可以指定路径参数,然后我从客户端接收到 onMessage。那么这如何与编程端点部署一起工作呢?
【问题讨论】:
-
extends Endpoint:Endpoint类包是什么?我真的看不出您使用的是哪个 websocket 实现。你学了哪个教程? -
我正在使用 Java EE websocket API。所以它来自包 javax.websocket.Endpoint。我遵循了 udemy 的教程。
-
好吧,我是个白痴,实际上有一种方法可以通过会话对象检索路径参数。
标签: java websocket glassfish endpoint