Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Отправка и получение сообщений

Конечные точки веб-сокетов могут отправлять и получать текстовые и бинарные сообщения. Кроме того, они также могут отправлять ping-команды и получать pong-команды. В этом разделе описывается, как использовать интерфейсы Session и RemoteEndpoint для отправки сообщений на подключённый одноранговый узел и как использовать аннотацию @OnMessage для получения сообщений от него.

Здесь рассматриваются следующие темы:

Отправка сообщений

Выполните следующие действия для отправки сообщений конечной точке.

  1. Получите объект Session из соединения.

    Объект Session доступен как параметр в аннотированных методах жизненного цикла конечной точки, как в табл. 19-1. Когда ваше сообщение является ответом на сообщение от партнёра, у вас есть объект Session, доступный внутри метода, который получил сообщение (метод, аннотированный @OnMessage). Если нужно отправлять сообщения, которые не являются ответами, сохраните объект Session как переменную объекта класса конечной точки в методе, аннотированном с помощью @OnOpen, чтобы можно было получить к нему доступ из других методов.

  2. Используйте объект Session для получения объекта RemoteEndpoint.

    Метод Session.getBasicRemote и метод Session.getAsyncRemote возвращают объекты RemoteEndpoint.Basic и RemoteEndpoint.Async соответственно. Интерфейс RemoteEndpoint.Basic предоставляет блокирующие методы для отправки сообщений. Интерфейс RemoteEndpoint.Async предоставляет неблокирующие методы.

  3. Используйте объект RemoteEndpoint для отправки сообщений одноранговому узлу.

    В следующем списке показаны некоторые методы, которые можно использовать для отправки сообщений одноранговому узлу.

    • void RemoteEndpoint.Basic.sendText(String text)

      Отправка текстового сообщения узлу. Этот метод блокируется, пока не будет передано всё сообщение.

    • void RemoteEndpoint.Basic.sendBinary(ByteBuffer data)

      Отправка бинарного сообщения узлу. Этот метод блокируется, пока не будет передано всё сообщение.

    • void RemoteEndpoint.sendPing(ByteBuffer appData)

      Отправка ping-команды узлу.

    • void RemoteEndpoint.sendPong(ByteBuffer appData)

      Отправка pong-команды узлу.

Пример в Аннотированные конечные точки демонстрирует, как использовать эту процедуру для ответа на каждое входящее текстовое сообщение.

Отправка сообщений всем узлам, подключённым к конечной точке

Каждый объект класса конечной точки связан только с одним соединением и одним узлом. Однако в некоторых случаях объекту конечной точки необходимо отправлять сообщения всем подключённым узлам. Примерами могут служить приложения чатов и онлайн-аукционов. Интерфейс Session предоставляет метод getOpenSessions для этой цели. В следующем примере показано, как использовать этот метод для пересылки входящих текстовых сообщений всем подключённым узлам:

@ServerEndpoint("/echoall")
public class EchoAllEndpoint {
   @OnMessage
   public void onMessage(Session session, String msg) {
      try {
         for (Session sess : session.getOpenSessions()) {
            if (sess.isOpen())
               sess.getBasicRemote().sendText(msg);
         }
      } catch (IOException e) { ... }
   }
}

Получение сообщений

Методы, аннотированные OnMessage, обрабатывают входящие сообщения. Допустимо иметь не более трёх методов, аннотированных @OnMessage, в конечной точке, по одному для каждого типа сообщения: текстового, бинарного и pong-команды. В следующем примере показано, как назначить методы для получения всех трёх типов сообщений:

@ServerEndpoint("/receive")
public class ReceiveEndpoint {
   @OnMessage
   public void textMessage(Session session, String msg) {
      System.out.println("Text message: " + msg);
   }
   @OnMessage
   public void binaryMessage(Session session, ByteBuffer msg) {
      System.out.println("Binary message: " + msg.toString());
   }
   @OnMessage
   public void pongMessage(Session session, PongMessage msg) {
      System.out.println("Pong message: " +
                          msg.getApplicationData().toString());
   }
}

Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)