Клиентска комуникация в реално време чрез Swing интерфейс

В тази публикация в блога ще разгледаме как да използвате Web Sockets за създаване на клиентска комуникация в реално време с помощта на swing приложение. Но първо нека разберем как работят Web Sockets.

Както можем да видим при HTTP комуникацията, след като клиентът получи отговор от сървъра, връзката се прекъсва. Но в случай на WebSocket, след като връзката се отвори, Клиент и Сървър могат да комуникират помежду си в реално време с множество заявки и отговори до затваряне на връзката.

Създаване на вашия първи Java Web-Socket проект

Първо, имаме нужда от библиотека, която да ни помогне при създаването на проекта. Ще използваме Eclipse Tyrus — Eclipse Tyrus е реализация с отворен код (API) за лесно разработване на WebSocket приложения. Това е лека, мащабируема и преносима WebSocket реализация, която позволява на Java приложенията да установяват двупосочна комуникация с клиенти през WebSocket връзка.

Добавете следните зависимости към вашия проект [Maven, Gradle, Ivy, SBT]:

  1. tyrus.server
  2. tyrus.client
  3. tyrus.container.grizzly

След като настроите вашия проект, нека продължим напред с частта за кодиране.

Код на сървъра

За да хостваме сървър, трябва да изпълним следните стъпки:

  1. Първо трябва да импортираме пакета org.glassfish.tyrus.server. Използвайки този пакет, можем да използваме класа Server.
  2. За да създадем обект на сървърен клас, трябва да предадем параметри на сървърния класКонструктор.

localhost е име на хост.

8026 е номерът на порт.

/folder е основният път за сървърното приложение.

ChatServerEndpoint.class връща обекта Class Class, използвайки който класът serverdemo може динамично да получи метаданните на ChatServerEndpoint.class, използвайки кой сървърен клас може да изпълни всички методи на класа.

3. За да стартираме сървъра, можем да използваме сървърния метод start().

Продукт

Продуктовият клас е модел за прехвърляне на данни.

Пишем самополучатели и настройкиза променливите pid, pname, price.

Крайна точка на ChatServer

Анотацията @ServerEndpoint маркира този клас като крайна точка на WebSocket сървър. Атрибутът value указва URL адреса на крайната точка („/app“ в този случай).

Атрибутитеencoders и decoders указват класовете, отговорни съответно за кодиране на изходящи съобщения и декодиране на входящи съобщения.

  1. Методът onOpen се изпълнява, когато се установи нова WebSocket връзка. Методът getId() връща текущия идентификатор на сесията.

2. Методът onMessage се извиква, когато се получи съобщение от клиент. Необходими са два параметъра (Product object представляващ съобщението и Session object представляващ връзката). getOpenSessions()итерира всички отворени сесии, а методът getBasicRemote().sendObject() изпраща полученото съобщение до всички свързани клиенти.

3. Методът onClose се изпълнява, когато WebSocket връзка е затворена. Той получава обекта на сесия и обект CloseReason, указващ причината за затварянето.

MessageEncoder

При WebSocket комуникацията обменът на данни се извършва под формата на съобщения между клиента и сървъра. Когато става въпрос за изпращане на сложни обекти, като Java обекти, през WebSocket връзка, кодер идекодер се използват за преобразуване на тези обекти в подходящ формат, който може да бъде предаван като текстови или двоични данни и след това реконструирани в приемащия край.

Този код представлява реализация на интерфейса Encoder.Text за кодиране на обект Product в JSON низ, който да бъде изпратен през WebSocket връзка.

MessageDecoder

Този код представлява реализация на интерфейса Decoder.Text за декодиране на JSON низ към обект Product, получен през WebSocket връзка.

Крайна точка на ChatClient

Този код създава просто GUI приложение за свързване към WebSocket сървър и изпращане/получаване на съобщения. Класът ChatClientEndpoint е анотиран с @ClientEndpoint, за да се укаже, че представлява крайна точка на клиент WebSocket.

Методът connectToWebSocket() инициализира връзката WebSocket. Той създава екземпляр на ChatClientEndpoint, настройва слушател на съобщения и се свързва с посочения URI.

  1. Методът onOpen се извиква, когато се установи WebSocket връзка. Той изпраща съобщение „старт“ до сървъра.
  2. Методът onMessage се извиква, когато се получи съобщение от сървъра. Той извиква метода actionPerformed на регистрирания MessageListener, за да обработи полученото съобщение.
  3. Методът onClose се извиква, когато WebSocket връзката е затворена. Той регистрира причината за затваряне и намалява резето.
  4. МетодътaddMessageListener в ChatClientEndpoint позволява регистриране на MessageListener за обработка на получените съобщения.

Програмен код

Пълният изходен код за описания пример е достъпен в моя GitHub. Разгледайте подробностите там и приятно кодиране.