2013-03-26 24 views
12

Điều này có lẽ là hiển nhiên, nhưng tôi mới làm quen với mô hình này. Tôi tạo một Máy chủ Jetty và đăng ký lớp websocket của tôi như sau:Làm cách nào để truy cập vào WebSockets được khởi tạo trong Jetty 9?

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

Websocket nhận được thông báo. Tôi cũng muốn có thể gửi tin nhắn ra khỏi máy chủ mà không cần phải nhận được một tin nhắn từ khách hàng. Làm cách nào để truy cập cá thể MyEchoSocket được tạo khi kết nối mở? Hoặc, nói chung, làm cách nào để gửi tin nhắn trên ổ cắm bên ngoài phương thức onText trong MyEchoSocket?

+0

Đó không hẳn là máy chủ. Nó sẽ không có ý nghĩa để bắt đầu gửi từ thời điểm đó kể từ khi bạn không biết bạn đang kết nối với ai, trừ khi bạn đang đáp ứng (phục vụ) một ai đó. –

+0

Lý do tôi làm việc với WebSockets là tôi nghĩ rằng đó là một lựa chọn tốt cho các tình huống mà bạn muốn đẩy từ phía máy chủ. MyEchoSocket có thể theo dõi các WebSocketConnections của riêng nó thông qua phương thức onConnect() của nó. Tôi chỉ không biết cách truy cập cá thể MyEchoSocket khi chương trình đang chạy. –

+0

Bạn đang cố gắng thúc đẩy ai? Nếu đó là sau khi ai đó đã kết nối với bạn, sau đó có thể sinh ra một số xử lý không đồng bộ để làm việc đẩy. –

Trả lời

27

Hai kỹ thuật phổ biến, được trình bày ở đây trong khái niệm phòng trò chuyện đơn giản hóa siêu.

Lựa chọn # 1: Có WebSocket báo cáo lại trạng thái của nó đến một vị trí trung tâm

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

Sau đó, chỉ cần sử dụng các vị trí trung tâm để nói chuyện với WebSockets bạn đã chọn.

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

// or 

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

Lựa chọn # 2: Đã WebSocket được tạo ra bằng tay với WebSocketCreator

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

Tại thời điểm này, bạn có thể sử dụng các kỹ thuật tương tự như trên để nói chuyện với WebSockets bạn đã chọn.

+2

Một lần nữa tôi đến giải cứu trên chiến trường Jetty. Nhiều đánh giá cao! –

+0

Bạn không nên sử dụng danh sách riêng tư members = Collections.synchronizedList (new ArrayList <>()); 'here? –

+0

Tối ưu hóa/cải tiến luôn cần thiết. Các ví dụ chỉ là những điều cơ bản, để hiểu các kỹ thuật, không được đưa ra như là mã hoàn chỉnh/chức năng/được tối ưu hóa. –

Các vấn đề liên quan