Websocket — конечная точка сервера и конечная точка клиента не обмениваются сообщениями

#java #websocket #glassfish #jsr356

#java #websocket #glassfish #jsr356

Вопрос:

В настоящее время я тестирую Websockets с Glassfish 4 и реализацией «на борту», но не могу отправлять или получать какие-либо сообщения, хотя следую учебным пособиям, таким как Java EE 7 Tutorial — Отправка и получение сообщений или как создавать приложения Java WebSocket с использованием JSR 356 API. Я хочу реализовать простую связь между клиентом и сервером, поэтому все, что у меня есть, это

сервер:

 @ServerEndpoint("/echotest")
public class Server {
    private static final Logger LOGGER = LoggerFactory.getLogger(Server.class);

    @OnOpen
    public void onOpen(Session session) {
        LOGGER.info("OnOpen invoked by Session '{}'.", session.getId());

        try {
            session.getBasicRemote().sendText("Hello Client!");
        } catch (IOException ex) {
            LOGGER.error("Message delivery failed.", ex);
        }
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        LOGGER.info("OnClose invoked by Session '{}'; Reason: {}.", session.getId(), closeReason.getReasonPhrase());
    }

    @OnMessage
    public void onMessage(Session session, String msg) {
        LOGGER.info("OnMessage invoked by Session '{}'; Message: {}.", session.getId(), msg);
    }
}
  

и клиент:

 @ClientEndpoint
public class Client {

    private static CountDownLatch latch;
    private static final Logger LOGGER = LoggerFactory.getLogger(Client.class);

    @OnOpen
    public void onOpen(Session session) {
        LOGGER.info("OnOpen invoked by Session '{}'.", session.getId());

        try {
            session.getBasicRemote().sendText("Hello Server!");
        } catch (IOException ex) {
            LOGGER.error("Message delivery failed.", ex);
        }
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        LOGGER.info("OnClose invoked by Session '{}'; Reason: {}.", session.getId(), closeReason.getReasonPhrase());
    }

    @OnMessage
    public void onMessage(Session session, String msg) {
        LOGGER.info("OnMessage invoked by Session '{}'; Message: {}.", session.getId(), msg);
    }

    public static void main(String[] args) {
        latch = new CountDownLatch(1);

        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        try {
            container.connectToServer(Client.class, new URI("ws://localhost:8080/Tstr/echotest"));
            latch.await();

        } catch (DeploymentException | URISyntaxException | InterruptedException | IOException e) {
            LOGGER.error("Connection error occured!", e);
        }
    }
}
  

Веб-сокет доступен, и я могу подключиться к серверу (изменение URI приводит к ошибке 404 handsheak), но ни один из (серверных) методов не будет вызван, и единственное сообщение журнала, которое я получаю, это:

 INFO: OnOpen invoked by Session 'acc92925-6682-4414-9e78-cf60a624b014'.
  

на стороне клиента. Я бы ожидал, что сервер, по крайней мере, зарегистрирует вызов onOpen. Использование (нетронутого) Glassfish 4 с Netbeans 8 для этого теста.

Любые предложения, почему нет обмена сообщениями?

Ответ №1:

Ваш код работает для меня, однако мне пришлось заменить Logger (slf4j?) На этот java.util.logging.Logger

Комментарии:

1. спасибо за быструю помощь! довольно странно, что при использовании Glassfish с SLF4J не вызывается серверный метод, и никакие другие исключения не генерируются … еще раз, большое вам спасибо