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

Java 如何访问Jetty 9中的实例化WebSocket?,java,websocket,jetty,Java,Websocket,Jetty,这可能是显而易见的,但我对这种范式还不熟悉。我创建一个Jetty服务器并注册我的websocket类,如下所示: Server server = new Server(8080); WebSocketHandler wsHandler = new WebSocketHandler() { @Override public void configure(WebSocketServletFactory f

这可能是显而易见的,但我对这种范式还不熟悉。我创建一个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
公共类聊天插座{
公开会议;
@OnWebSocketConnect
public void onConnect(会话){
this.session=会话;
ChatRoom.getInstance().join(this);
}
@OnWebSocketMessage
公共void onText(字符串消息){
getInstance().writeAllMembers(“Hello all”);
}
@OnWebSocketClose
public void onClose(int statusCode,字符串原因){
ChatRoom.getInstance().part(this);
}
}
公共课堂聊天室{
私有静态最终聊天室实例=新建聊天室();
公共静态聊天室getInstance()
{
返回实例;
}
私有列表成员=新的ArrayList();
公共无效联接(ChatSocket套接字)
{
成员。添加(套接字);
}
公共空隙部分(插座)
{
拆下(插座);
}
public void writealMembers(字符串消息)
{
用于(ChatSocket成员:成员)
{
member.session.getRemote().sendStringByFuture(消息);
}
}
public void writeSpecificMember(字符串成员名称、字符串消息)
{
ChatSocket成员=findMemberByName(memberName);
member.session.getRemote().sendStringByFuture(消息);
}
公共ChatSocket findMemberByName(字符串memberName)
{
//留给读者做练习
}
}
然后只需使用中心位置与您选择的WebSocket对话

聊天室.getInstance().writeSpecificMember(“alex”,“Hello”); //或 getInstance().writeAllMembers(“Hello all”); 选项#2:使用WebSocketCreator手动创建WebSocket

@WebSocket
公共类聊天插座{
公共聊天室;
公共聊天插座(聊天室聊天室)
{
this.chatroom=聊天室;
}
@OnWebSocketConnect
public void onConnect(会话){
聊天室。加入(这个);
}
@OnWebSocketMessage
公共void onText(字符串消息){
聊天室。书面成员(信息);
}
@OnWebSocketClose
public void onClose(int statusCode,字符串原因){
聊天室。部分(本);
}
}
公共类ChatCreator实现WebSocketCreator
{
私人聊天室;
公共聊天室创建者(聊天室聊天室)
{
this.chatroom=聊天室;
}
公共对象createWebSocket(升级请求,
升级(响应)
{
//我们要创建聊天套接字并与之关联
//这与我们的聊天室实现是一致的
返回新的聊天室(聊天室);
}
}
公共类ChatHandler扩展WebSocketHandler
{
私人聊天室聊天室=新聊天室();
@凌驾
公共void配置(WebSocketServletFactory工厂)
{
setCreator(新聊天室);
}
}

此时,您可以使用与上述相同的技术与您选择的WebSocket对话。

两种常见的技术,在这里以超级简化的聊天室概念呈现

选项#1:让WebSocket向中心位置报告其状态

@WebSocket
公共类聊天插座{
公开会议;
@OnWebSocketConnect
public void onConnect(会话){
this.session=会话;
ChatRoom.getInstance().join(this);
}
@OnWebSocketMessage
公共void onText(字符串消息){
getInstance().writeAllMembers(“Hello all”);
}
@OnWebSocketClose
public void onClose(int statusCode,字符串原因){
ChatRoom.getInstance().part(this);
}
}
公共课堂聊天室{
私有静态最终聊天室实例=新建聊天室();
公共静态聊天室getInstance()
{
返回实例;
}
私有列表成员=新的ArrayList();
公共无效联接(ChatSocket套接字)
{
成员。添加(套接字);
}
公共空隙部分(插座)
{
拆下(插座);
}
public void writealMembers(字符串消息)
{
用于(ChatSocket成员:成员)
{
member.session.getRemote().sendStringByFuture(消息);
}
}
public void writeSpecificMember(字符串成员名称、字符串消息)
{
ChatSocket成员=findMemberByName(memberName);
member.session.getRemote().sendStringByFuture(消息);
}
公共ChatSocket findMemberByName(字符串memberName)
{
//留给读者做练习
}
}
然后只需使用中心位置与您选择的WebSocket对话

聊天室.getInstance().writeSpecificMember(“alex”,“Hello”); //或 getInstance().writeAllMembers(“Hello all”); 选项#2:使用WebSocketCreator手动创建WebSocket

@WebSocket
公共类聊天插座{
公共聊天室;
公共聊天插座(聊天室聊天室)
{
this.chatroom=聊天室;
}
@OnWebSocketConnect
public void onConnect(会话){
聊天室。加入(这个);
}
@OnWebSocketMessage
公共void onText(字符串消息){
聊天室。书面成员(信息);
}
@OnWebSocketClose
公共空间一旦关闭(内部状态)