2012-04-29 26 views
7

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?

+0

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? –

Trả lời

1

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.

+0

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

5

Đề 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.

3

đâ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); 
+0

Đố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. –

+0

@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

9

Đố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

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