我如何访问实例化的WebSockets在Jetty 9



这可能是显而易见的,但我对这种范式并不熟悉。我创建了一个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));
    }
}

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

相关内容

  • 没有找到相关文章

最新更新