Khi đọc hướng dẫn Netty, tôi đã tìm thấy một description đơn giản về cách tích hợp Netty và Google Protocol Buffers. Tôi đã bắt đầu điều tra ví dụ của nó (vì không có thêm thông tin trong tài liệu) và viết một ứng dụng đơn giản như ứng dụng thời gian địa phương ví dụ. Nhưng ví dụ này là sử dụng khởi tạo tĩnh trong PipeFactory Class, ví dụ:Netty + ProtoBuffer: Một vài thông báo liên lạc cho một kết nối
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.handler.codec.protobuf.ProtobufDecoder;
import org.jboss.netty.handler.codec.protobuf.ProtobufEncoder;
import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder;
import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender;
import static org.jboss.netty.channel.Channels.pipeline;
/**
* @author sergiizagriichuk
*/
class ProtoCommunicationClientPipeFactory implements ChannelPipelineFactory {
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline p = pipeline();
p.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());
p.addLast("protobufDecoder", new ProtobufDecoder(Communication.DataMessage.getDefaultInstance()));
p.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
p.addLast("protobufEncoder", new ProtobufEncoder());
p.addLast("handler", new ProtoCommunicationClientHandler());
return p;
}
}
(Xin hãy xem tại dòng p.addLast("protobufDecoder", new ProtobufDecoder(Communication.DataMessage.getDefaultInstance()));
) và chỉ là một nhà máy có thể được tạo ra (như tôi hiểu) cho ClientBootstrap
lớp, ý tôi là bootstrap.setPipelineFactory()
phương pháp . Vì vậy, trong tình huống này, tôi có thể sử dụng ONE nhắn gửi đến máy chủ và ONE nhắn nhận được từ máy chủ và nó có hại cho tôi, và tôi nghĩ rằng không chỉ cho tôi :(Làm thế nào tôi có thể sử dụng thông điệp khác nhau đến và đi từ chỉ một kết nối? có lẽ tôi có thể tạo ra một vài protobufDecoder
như
p.addLast("protobufDecoder", new ProtobufDecoder(Communication.DataMessage.getDefaultInstance()));
p.addLast("protobufDecoder", new ProtobufDecoder(Communication.TestMessage.getDefaultInstance()));
p.addLast("protobufDecoder", new ProtobufDecoder(Communication.SrcMessage.getDefaultInstance()));
hoặc kỹ thuật khác này? Thanks a lot.
Bạn có thể thêm nhiều bộ giải mã/bộ mã hóa trong đường ống, nhưng chúng sẽ có thể chuyển dữ liệu mà chúng không biết cách xử lý. Nhìn vào [nguồn netty tại github] (https://github.com/netty/netty/blob/master/src/main/java/org/jboss/netty/handler/codec/protobuf/ProtobufDecoder.java) Có vẻ như Thực tế không phải là như vậy. Vì vậy, có lẽ có một cách để làm điều đó, nhưng tôi hoài nghi nó là đơn giản. Hãy thử anyway và chia sẻ kết quả :) – Slartibartfast
@Slartibartfast Vâng, nó không phải là đơn giản và muốn làm việc chăm chỉ: ( –