如何在 Jetty 9 中访问实例化的 WebSocket?

2023-12-26

这可能是显而易见的,但我对这种范例很陌生。我创建一个 Jetty 服务器并注册我的 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 实例?或者,更一般地说,如何在 MyEchoSocket 中 onText 方法之外的套接字上发送消息?


此处以超级简化的聊天室概念介绍了两种常见技术。

选项#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<ChatSocket> 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
    }
}

然后只需使用中心位置即可与您选择的 Websockets 进行通信。

ChatRoom.getInstance().writeSpecificMember("alex", "Hello");

// or

ChatRoom.getInstance().writeAllMembers("Hello all");

选项#2:使用 WebSocketCreator 手动创建 WebSocket

@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));
    }
}

此时,您可以使用与上述相同的技术来与您选择的 Websocket 进行通信。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Jetty 9 中访问实例化的 WebSocket? 的相关文章

随机推荐

  • 构造正则表达式模式来匹配句子

    我正在尝试编写一种正则表达式模式 该模式将匹配以多个或一个制表符和 或空格开头的任何句子 例如 我希望我的正则表达式模式能够匹配 你好 我喜欢正则表达式 但我正在摸索如何匹配 hello 之后的单词 到目前为止我有这个 String REG
  • 使用 Bokeh 查看 dicom 图像

    我正在尝试将图形背景设置为 dicom 图像 我跟着这个例子 http bokeh pydata org en 0 11 1 docs gallery image rgba html 但是图像数据由dicom pixel array不是RG
  • 我的java代码有一个明显的错误。为什么能编译并运行?

    public class HelloWorld public static void main String args System out println Hello http www google com System out prin
  • 使用 QueryMap 进行改造

    我有一些相同的要求endpoint但参数和返回类型不同 I used QueryMap对于参数但我不知道如何编写返回类型 我必须写 GET xxx Call
  • 如何在jquery中将日期和时间转换为timeago格式

    我正在尝试显示 Facebook 新闻源并在移动网络应用程序上显示它们 它工作正常 但问题是它在移动网络浏览器上不以 timeago 格式 即 2 天前 显示时间 但另一方面它在桌面上正确显示 日期和时间的格式为 2011 09 13T11
  • React Swiper Js 自动播放不会使雨刮器自动滑动

    我在 React 中使用这个滑动器 https swiperjs com react https swiperjs com react 我试图使其 自动播放 但它不会自动滑动 这是我尝试过的 https swiperjs com get s
  • Ruby Http Post 参数

    如何将帖子参数添加到我现在拥有的内容中 toSend nonce gt Time now to i command gt returnCompleteBalances to json uri URI parse https poloniex
  • 通知是什么:资源 id#9? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • Coq:将信息保存在匹配语句中

    我正在构建一个递归函数match在清单上l 在里面cons分支我需要使用以下信息l cons a l 为了证明递归函数终止 但是 当我使用match l信息丢失 我该如何使用match保留信息 这是函数 drop and drop lemm
  • 从存储库 Databricks 中的另一个笔记本运行笔记本

    我有一个笔记本 其功能位于存储库文件夹中 我试图在另一个笔记本中运行它 通常我可以这样运行它 run Users name project file name 因此 我将这两个文件 function notebook processed n
  • 是否可以执行 If Else 或 Switch 语句 Firestore 规则

    是否可以在 firestore 规则中执行 Switch 语句或 if else 我试图寻找它 但没有找到答案 我尝试的是 function getTier return get users request auth uid data us
  • Synology 网站简单的“hello world”快速入门使用 python、flask 和 uwsgi

    我注意到 Synology 的本机网站使用 uwsgi 框架 最近添加了对 python 脚本的支持 我想知道是否有人可以帮我找出一个简单的 hello world 示例 我不清楚 uwsgi 文件中应放入什么内容 我按照 uwsgi 文档
  • 这种锁定技术的名称是什么?

    我有一个巨大的 Trove 地图和一个需要从多个线程经常调用的方法 大多数时候这个方法会返回true 线程正在进行大量的数字运算 我注意到由于以下方法而存在一些争用 这只是一个示例 我的实际代码有点不同 synchronized boole
  • Jenkins 构建流程与工作流程(管道)插件

    我注意到 Jenkins 至少 有两个编排选项 构建流程 https wiki jenkins ci org display JENKINS Build Flow Plugin Workflow https github com jenki
  • float 变量不满足条件 (C)

    我试图让用户输入 1 00000 到 0 00001 之间的数字 而边缘不包含在浮点变量中 我可以假设用户在点后输入的数字不超过 5 个 现在 这是我写的 printf Enter required Leibniz gap Between
  • 是否可以更改代理的目标?

    我有一个实现 XMLHttpRequest 接口的类 取决于传递给的 URLopen 我可以确定是使用默认的 XMLHttpRequest 还是我的自定义实现 我的想法是使用代理来执行此操作 let xhr new XHRProxy xhr
  • 仅覆盖分区 Spark 数据集中的部分分区

    我们如何覆盖分区数据集 但只覆盖我们要更改的分区 例如 重新计算上周的日常工作 并且只覆盖上周的数据 Spark 的默认行为是覆盖整个表 即使只写入某些分区 从 Spark 2 3 0 开始 这是覆盖表时的一个选项 要覆盖它 您需要设置新的
  • “pip install --user ...”的目的是什么?

    From pip install help user Install to the Python user install directory for your platform Typically local or APPDATA Pyt
  • 测试元素是否已经有 jQuery datepicker

    我有一个包含许多输入元素的表单 有些是已附加 jQuery UI 日期选择器的日期字段 someElement mask 9 9 99 9999 datepicker showOn button buttonText Click here
  • 如何在 Jetty 9 中访问实例化的 WebSocket?

    这可能是显而易见的 但我对这种范例很陌生 我创建一个 Jetty 服务器并注册我的 websocket 类 如下所示 Server server new Server 8080 WebSocketHandler wsHandler new