Как получить доступ к экземплярам WebSockets в Jetty 9?

Это, вероятно, очевидно, но я новичок в этой парадигме. Я создаю сервер Jetty и зарегистрирую свой class websocket следующим образом:

Server server = new Server(8080); WebSocketHandler wsHandler = new WebSocketHandler() { @Override public void configure(WebSocketServletFactory factory) { factory.register(MyEchoSocket.class); } }; server.setHandler(wsHandler); 

Websocket получает сообщения в порядке. Я хотел бы также иметь возможность отправлять сообщения с сервера, не получив сначала сообщение от клиента. Как получить доступ к экземпляру MyEchoSocket, который создается при открытии соединения? Или, в более общем плане, как отправлять сообщения в сокете вне метода onText в MyEchoSocket?

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

    Вариант № 1: сообщите WebSocket свое состояние в центральное место

     @WebSocket public class ChatSocket { public Session session; @OnWebSocketConnect public void onConnect(Session session) { this.session = session; ChatRoom.getInstance().join(this); } @OnWebSocketMessage public void onText(String message) { ChatRoom.getInstance().writeAllMembers("Hello all"); } @OnWebSocketClose public void onClose(int statusCode, String reason) { ChatRoom.getInstance().part(this); } } public class ChatRoom { private static final ChatRoom INSTANCE = new ChatRoom(); public static ChatRoom getInstance() { return INSTANCE; } private List members = new ArrayList<>(); public void join(ChatSocket socket) { members.add(socket); } public void part(ChatSocket socket) { members.remove(socket); } public void writeAllMembers(String message) { for(ChatSocket member: members) { member.session.getRemote().sendStringByFuture(message); } } public void writeSpecificMember(String memberName, String message) { ChatSocket member = findMemberByName(memberName); member.session.getRemote().sendStringByFuture(message); } public ChatSocket findMemberByName(String memberName) { // left as exercise to reader } } 

    Затем просто используйте центральное расположение, чтобы поговорить с веб-сайтами по вашему выбору.

     ChatRoom.getInstance().writeSpecificMember("alex", "Hello"); // or ChatRoom.getInstance().writeAllMembers("Hello all"); 

    Вариант №2: создать WebSocket вручную с помощью WebSocketCreator

     @WebSocket public class ChatSocket { public ChatRoom chatroom; public ChatSocket(ChatRoom chatroom) { this.chatroom = chatroom; } @OnWebSocketConnect public void onConnect(Session session) { chatroom.join(this); } @OnWebSocketMessage public void onText(String message) { chatroom.writeAllMembers(message); } @OnWebSocketClose public void onClose(int statusCode, String reason) { chatroom.part(this); } } public class ChatCreator implements WebSocketCreator { private ChatRoom chatroom; public ChatCreator(ChatRoom chatroom) { this.chatroom = chatroom; } public Object createWebSocket(UpgradeRequest request, UpgradeResponse response) { // We want to create the Chat Socket and associate // it with our chatroom implementation return new ChatSocket(chatroom); } } public class ChatHandler extends WebSocketHandler { private ChatRoom chatroom = new ChatRoom(); @Override public void configure(WebSocketServletFactory factory) { factory.setCreator(new ChatCreator(chatroom)); } } 

    На этом этапе вы можете использовать те же методы, что и выше, чтобы поговорить с веб-сайтами по вашему выбору.

    Interesting Posts

    Как использовать пользовательскую сериализацию или десериализацию в WCF, чтобы принудительно создать новый экземпляр для каждого свойства datacontact?

    Как удалить indexedDB в Chrome

    EntityManager закрыт

    exif проблема вращения изображения с использованием несущей и rmagick для загрузки на s3

    Как зарегистрировать пользователя, когда они закрывают свой браузер или вкладку в ASP.NET MVC?

    Почему Internet Explorer 11 не соблюдает условные комментарии даже при эмуляции режима документа Internet Explorer 8?

    Почему параллельный stream не использует все streamи ForkJoinPool?

    Что делать с настройками реестра DVD / DVD-драйверов LowerFilters и UpperFilters?

    Как открыть старый проект MVC в Visual Studio 2012 или Visual Studio 2013?

    Разница между `set`,` setq` и `setf` в Common Lisp?

    Проверить, что точка (x, y) находится между двумя точками, нарисованными по прямой

    msbuild, определяющий условные символы компиляции

    Что означает 8badf00d?

    Android: в таблице нет столбца с именем «имя переменной» Ошибка базы данных MySql

    Android LinearLayout: добавьте границу с тенью вокруг LinearLayout

    Давайте будем гением компьютера.