2015-09-29 22 views
8

Để thuyết phục một số người chuyển từ công nghệ trường học cũ, tôi cần xây dựng ứng dụng trình diễn trò chuyện quản lý hơn 10K kết nối đồng thời sử dụng Java (như Node.Js nội dung).Làm cách nào để quản lý người dùng được kết nối qua websocket bằng Vert.x 3?

Tôi đã thử nghiệm Netty 5.0 thật tuyệt vời nhưng đòi hỏi nhiều việc phải làm; Mặt khác, Cầu cảng 9.3 rất tuyệt nhưng chậm so với các đối thủ cạnh tranh khác.

Sau khi một số tìm kiếm Tôi tìm thấy Vert.x 3 bộ công cụ mà là dựa trên Netty với một loạt các công cụ tuyệt vời (không cần phải phát minh lại bánh xe), tôi đã thấy các ví dụ trong git và tôi đã có thể để xây dựng một máy chủ WebSocket vv

public void start() throws Exception { 
    vertx.createHttpServer().websocketHandler(new Handler<ServerWebSocket>() { 
     @Override 
     public void handle(ServerWebSocket e) { 
      // business stuff in the old style not yet lambda 
     } 
    }).listen(port); 
} 

là mới đến thế giới Vert.x, tôi không thể tìm ra cách để quản lý người dùng kết nối sử dụng nó, thường cách thời trang cũ là sử dụng cái gì đó như:

HashMap<UUID,ServerWebSocket> connectedUsers; 

Khi kết nối được thiết lập, tôi kiểm tra xem nó có tồn tại không; nếu tôi không thêm nó như là một mục mới và làm một số chức năng để gửi, phát sóng, lấy thông qua bộ sưu tập và như vậy.

Câu hỏi của tôi là Vert.x 3 có điều gì đó để xử lý các kết nối để theo dõi chúng và xóa những người còn lại (ping pong), phát sóng, v.v. hoặc tôi nên triển khai chúng từ đầu bằng cookie, phiên,. ...)

tôi không thể tìm thấy bất kỳ ví dụ thực tế sử dụng Vert.x 3.

+0

Thuyết phục điều gì? Bạn có thể xử lý hàng chục nghìn kết nối với mã được viết cho các API có sẵn trong những năm 1980. – EJP

+0

tôi muốn sử dụng cách tiếp cận không đồng bộ và giảm phần cứng bạn thấy không? – merou

Trả lời

0

về cơ bản, phạm vi của websocketHandler đại diện cho một kết nối. Trong ví dụ của bạn, đây là lớp ẩn danh của bạn. Tôi đã tạo một websocket trò chuyện nhỏ example nơi tôi sử dụng xe buýt sự kiện Vert.x để phân phối tin nhắn tới tất cả các máy khách.

Trong phương thức khởi động của máy chủ, chúng tôi xử lý các kết nối websocket. Bạn có thể thực hiện closeHandler để giám sát ngắt kết nối máy khách. Ngoài ra còn có các trình xử lý cho các ngoại lệ, ping-pong, v.v. Bạn có thể xác định một kết nối cụ thể bằng cách sử dụng textHandlerID, nhưng bạn cũng có quyền truy cập vào địa chỉ từ xa.

public void start() throws Exception { 
     vertx.createHttpServer().websocketHandler(handler -> { 
      System.out.println("client connected: "+handler.textHandlerID()); 

      vertx.eventBus().consumer(CHAT_CHANNEL, message -> { 
       handler.writeTextMessage((String)message.body()); 
      }); 

      handler.textMessageHandler(message -> { 
       vertx.eventBus().publish(CHAT_CHANNEL,message); 
      }); 

      handler.closeHandler(message ->{ 
       System.out.println("client disconnected "+handler.textHandlerID()); 
      }); 

     }).listen(8080); 
    } 

Ví dụ khách hàng cũng được viết bằng Java. Nó chỉ in tất cả các tin nhắn nhận được trên kết nối websocket tới bàn điều khiển. Sau khi kết nối nó sẽ gửi một tin nhắn.

public void start() throws Exception { 
     HttpClient client = vertx.createHttpClient(); 

     client.websocket(8080, "localhost", "", websocket -> { 
      websocket.handler(data -> System.out.println(data.toString("ISO-8859-1"))); 
      websocket.writeTextMessage(NAME+ ":hello from client"); 
     }); 

    } 
+0

Khi khách hàng mất kết nối (Chế độ máy bay), máy chủ không phát hiện được. – mstafkmx

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