Tôi đã sử dụng mã ví dụ netty - gói telnet, Bây giờ mã có thể thiết lập máy chủ và ứng dụng khách để trò chuyện bằng telnet, nhưng khách hàng chỉ có thể nói chuyện với máy chủ. Tôi viết lại nó để làm cho khách hàng có thể nói chuyện với tất cả khách hàng, vì vậy tôi cần giữ một danh sách kênh, vì vậy khi một khách hàng liên lạc với máy chủ, máy chủ có thể gửi tin nhắn tới tất cả các khách hàng. Bất cứ ai có thể cho tôi biết làm thế nào tôi có thể nhận được tất cả các kênh khách hàng? (Đoạn mã ví dụ là enter link description here)Netty - làm thế nào để có được tất cả các kênh khách hàng?
Trả lời
Tại sự kiện channelConnected, lấy khách hàng từ ChannelHandlerContext và lưu nó ở đâu đó (một bộ sưu tập đồng thời sẽ được tốt đẹp, như ConcurrentHashMap). Bạn cũng sẽ phải triển khai phương thức channelClosed để xóa kênh đã ngắt kết nối khỏi bộ sưu tập của mình.
Cảm ơn, tôi đã thử nó lúc đầu, nhưng thất bại vì tôi không biết rằng ChannelPipelineFactory thực hiện tạo ra Handler, bằng cách xây dựng một lưu trữ cho các kênh ở đúng vị trí, tôi đã thành công để làm điều đó.Dù sao, cảm ơn rất nhiều :) – chentingpc
Đề xuất của Mauricio là một đề xuất tốt. Ngoài ra, API Netty đã cung cấp vùng chứa kênh trong số ChannelGroup. Đó là chủ đề an toàn và cũng cung cấp một số tính năng bổ sung như hoạt động nhóm trên tất cả các kênh có sẵn và tự động xóa các kênh có chứa khi chúng được đóng lại. Từ javadoc:
Bộ an toàn chủ đề chứa Kênh mở và cung cấp nhiều hoạt động khác nhau trên chúng. Sử dụng ChannelGroup, bạn có thể phân loại Kênh thành một nhóm có ý nghĩa (ví dụ: trên cơ sở mỗi dịch vụ hoặc theo từng tiểu bang .) Kênh khép kín sẽ tự động bị xóa khỏi bộ sưu tập, để bạn không cần phải lo lắng về cuộc sống chu kỳ của kênh được thêm vào . Kênh có thể thuộc nhiều Nhóm kênh.
đây là một ví dụ nhỏ (ghi đè channelConnected của SimpleChannelUpstreamHandler):
ChannelGroup allConnected = new DefaultChannelGroup("all-connected");
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
super.channelConnected(ctx, e);
allConnected.add(e.getChannel());
}
bây giờ bạn có thể gửi tin nhắn cho tất cả các kênh kết nối như sau:
ChannelBuffer cb = ChannelBuffers.wrappedBuffer("hello".getBytes(Charset.forName("UTF-8")));
allConnected.write(cb);
Đối với Netty 4/5, có một ví dụ tương tự trong javadoc, http://netty.io/4.0/api/io/netty/channel/group/ChannelGroup.html ghi đè channelActive() thay vào đó và cũng gọi phương thức siêu _after_ thêm kênh. –
@StefanL đưa ra ví dụ trong tài liệu, làm thế nào tôi có thể có được kênh của khách hàng? (trong ví dụ: channelA, channelB ..) – HCarrasko
Đối Netty 4.0.x
Trong lớp chính bạn cần khai báo Nhóm kênh:
final ChannelGroup channels =
new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
Khi một khách hàng mới được kết nối (Bạn phải vượt qua các kênh đối tượng trong constructor để bạn xử lý lớp):
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
channels.add(ctx.channel());
}
Để có được tất cả khách hàng, chỉ làm việc trên các kênh truyền hình đối tượng :) Nếu bạn muốn lặp nó:
for (Channel ch : channels) {
//do something with ch object :)
}
Hy vọng nó sẽ giúp cho các thế hệ kế tiếp
- 1. Làm thế nào để có được một số ID cho Kênh Netty?
- 2. Netty 4 nhiều khách hàng
- 3. Phát hiện kín kênh Netty
- 4. Câu lệnh SQL để có được tất cả khách hàng không có đơn đặt hàng
- 5. Lỗi jQuery ?? Làm thế nào để có được "td" đầu tiên trong tất cả các hàng có thể nhìn thấy
- 6. Làm thế nào để có được thông tin về các khách hàng trong Node.js
- 7. Làm thế nào để có được tất cả các đơn đặt hàng và tất cả các hóa đơn từ php trong Magento?
- 8. Làm thế nào để có được tất cả các bảng có FK đến một bảng khác?
- 9. Làm thế nào để có được tất cả các trường của một hàng bằng hàm SQL MAX?
- 10. Cách viết một Máy khách Netty hiệu năng cao
- 11. Làm thế nào để có được tất cả các ID với jQuery?
- 12. Làm thế nào để có được tất cả các ý kiến từ Disqus?
- 13. Làm thế nào để có được tất cả các tập con của một mảng?
- 14. Jira và git: Làm thế nào để có được tất cả các chi nhánh phản ánh?
- 15. Làm thế nào để có được tất cả các trận đấu từ regex?
- 16. Làm thế nào để có được tất cả các lớp CSS của một phần tử?
- 17. Làm thế nào để có được tất cả các yếu tố theo tên lớp?
- 18. Làm thế nào để có được tất cả các cookie từ CookieManager android?
- 19. Làm thế nào để có được tất cả các tài liệu của chỉ số lucene?
- 20. Làm thế nào để có được tất cả các thông số bài trong Symfony2?
- 21. Làm thế nào để có được tất cả các tham số GET trên Silex?
- 22. WCF - nhà máy kênh và cơ sở khách hàng
- 23. Làm thế nào để hiển thị tất cả các hàng trong jqGrid?
- 24. làm thế nào để xóa tất cả các hàng của UITableView
- 25. Làm thế nào để hiển thị tất cả các hàng theo mặc định trong JQuery DataTable
- 26. Nhận tất cả các hàng không được lọc từ jqGrid
- 27. Làm thế nào để loại bỏ tất cả các hàng trong một numpy.ndarray có chứa các giá trị phi số
- 28. Android: Làm thế nào để có được bản địa Email khách hàng gói tên
- 29. Lệnh Redis để nhận tất cả các kênh có sẵn cho pub/sub?
- 30. Gửi nhiều yêu cầu asynchonous trên máy khách Netty
bạn có quản lý để nhận tất cả các kênh khách hàng chính xác không? –