简体   繁体   English

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

[英]How do I access instantiated WebSockets in Jetty 9?

This is probably obvious, but I am new to this paradigm. 这可能很明显,但是我对这种范例是陌生的。 I create a Jetty Server and register my websocket class as follows: 我创建一个Jetty服务器并注册我的websocket类,如下所示:

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

The websocket receives messages fine. websocket收到消息很好。 I would like to also be able to send messages out from the server without having first received a message from the client. 我还希望能够先从服务器发送消息,而无需先从客户端接收消息。 How do I access the MyEchoSocket instance that's created when the connection opens? 如何打开连接打开时创建的MyEchoSocket实例? Or, more generally, how do I send messages on the socket outside of the onText method in MyEchoSocket? 或者,更一般而言,如何在MyEchoSocket中的onText方法之外的套接字上发送消息?

Two common techniques, presented here in a super simplified chatroom concept. 在超级简化的聊天室概念中介绍了两种常用技术。

Option #1: Have WebSocket report back its state to a central location 选项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
    }
}

Then simply use the central location to talk to the websockets of your choice. 然后,只需使用中心位置即可与您选择的websocket通信。

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

// or

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

Option #2: Have WebSocket be created manually with WebSocketCreator 选项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));
    }
}

At this point you can use the same techniques as above to talk to the websockets of your choice. 此时,您可以使用与上述相同的技术来与您选择的websocket通信。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM