프로토콜 버퍼를 serializer로 사용하는 응용 프로그램을 개발 중입니다. 내 응용 프로그램은 서버에 대한 클라이언트가됩니다. 요구 사항은 protobuf 데이터를 보내기 전에 protobuf 데이터의 크기를 4 바이트로 시작해야한다는 것입니다. Netty를 소켓 라이브러리로 사용하고 있습니다. 필자는 내장 프로토콜 버퍼 인코더와 디코더를 사용했지만 올바른 결과를 얻지 못했습니다. 파이프 라인 코드프로토콜 버퍼 챌린지
public class SmpPipelineFactory implements ChannelPipelineFactory {
private final Logger logger = LoggerFactory.getLogger(getClass());
/**
*
*/
public SmpPipelineFactory() {
}
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline p = pipeline();
// Add Decoders
p.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());
//p.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4));
p.addLast("protobufDecoder", new ProtobufDecoder(Pdu.getDefaultInstance()));
// Add encoders
p.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
//p.addLast("frameEncoder", new LengthFieldPrepender(4));
p.addLast("protobufEncoder", new ProtobufEncoder());
p.addLast("handler", new SmpChannelConnector());
return p;
}
}
어떤 도움이 감사합니다 도움이 될 것입니다 : 이것은 내가 실행하고 코드입니다.
C# 서버에 연결 중입니다. 4 바이트 길이의 protobuf 디코더가 필요합니다. – Arsene
저는 C# 전문가는 아니지만 C# int "length"의 바이너리 형식 인 4 바이트, 서명 된 또는 서명되지 않은 litte-endian 또는 big-endian을 알아야합니다. 그런 다음이 형식을 사용하여 프레임에 클라이언트 Java 코드를 적용하십시오. io.netty.handler.codec.LengthFieldPrepender를 FRAME_ENCODER로, LengthFieldBasedFrameDecoder를 FRAME_DECODER (서버 만 필요할 수도 있음)로 사용하면 효과가 있습니다. – pjklauser