如何在Jetty 9中访问实例化的WebSockets?
这可能是显而易见的,但我对这个范例是新的。 我创build一个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收到消息罚款。 我也希望能够从服务器发送消息,而不必先从客户端收到消息。 如何访问连接打开时创build的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 } }
然后,只需使用中心位置与您select的websocket进行通信即可。
ChatRoom.getInstance().writeSpecificMember("alex", "Hello"); // or ChatRoom.getInstance().writeAllMembers("Hello all");
选项2:使用WebSocketCreator手动创buildWebSocket
@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)); } }
在这一点上,您可以使用上述相同的技术来与您select的Websocket进行通信。