2016-07-13 1 views
1

protobuf를 사용하는 서버가 있습니다. 다음과 같이 파이프 라인은Netty, ProtoBuf, WebSocket; BinaryWebSocketFrame을 protobuf 형식으로 변환하는 방법?

public class ServerHandler extends SimpleChannelInboundHandler<MyProtoBufType> { 

- - 핸들러는 다음과 같이 정의되어 있고 자바 클라이언트 모든 것이 잘 작동으로

pipeline.addLast(new ProtobufVarint32FrameDecoder()); 
pipeline.addLast(new ProtobufDecoder(MyProtoBufType.getDefaultInstance())); 
pipeline.addLast(new ProtobufVarint32LengthFieldPrepender()); 
pipeline.addLast(new ProtobufEncoder()); 
pipeline.addLast("ServerHandler", new ServerHandler()); 

.

var ProtoBuf = dcodeIO.ProtoBuf, 
    builder = ProtoBuf.loadProtoFile("./example.proto"), 
    pkg = builder.build("com.example"); 
    socket = new WebSocket("ws://localhost:8484"); 

socket.binaryType = "arraybuffer"; 

socket.onopen = function() { 
    var login = new pkg.Login({"userName": "hello", "password": "pass"}); 
    var wrapper = new pkg.MyProtoBufType(); 
    wrapper.set("login", login); 
    socket.send(wrapper.toArrayBuffer()); 
}; 

더 - protobufjs 라이브러리를 기반으로 자바 스크립트 클라이언트 코드는 다음

pipeline.addLast(new HttpServerCodec()); 
pipeline.addLast(new HttpObjectAggregator(65536)); 
pipeline.addLast(new WebSocketServerCompressionHandler()); 
pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true)); 
pipeline.addLast(new MessageToMessageDecoder<WebSocketFrame>() { 
    @Override 
    protected void decode(ChannelHandlerContext ctx, WebSocketFrame frame, List<Object> objs) throws Exception { 
     ByteBuf buf = ((BinaryWebSocketFrame) frame).content(); 
     objs.add(buf); 
     buf.retain(); 
    } 
}); 
pipeline.addLast(new ProtobufVarint32FrameDecoder()); 
pipeline.addLast(new ProtobufDecoder(MyProtoBufType.getDefaultInstance())); 
pipeline.addLast(new ProtobufVarint32LengthFieldPrepender()); 
pipeline.addLast(new ProtobufEncoder()); 
pipeline.addLast("ServerHandler", new ServerHandler()); 

- 다음과 같이

이제, 자바 스크립트 웹 소켓을 사용하여 연결 할 수 있도록, 나는 서버 파이프 라인을 수정 위 코드가 실행되면 서버가 protobuf 디코더에서 실패합니다. 다음은 stacktrace입니다. -

WARN [nioEventLoopGroup-3-6] (DefaultChannelPipeline.java:1144) - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. 
io.netty.handler.codec.DecoderException: com.google.protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field. This could mean either than the input has been truncated or that an embedded message misreported its own length. 
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:98) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:335) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:327) 
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:288) 
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:275) 
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:391) 
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:243) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:335) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:327) 
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:335) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:327) 
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:335) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:327) 
    at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) 
    at io.netty.handler.codec.http.websocketx.Utf8FrameValidator.channelRead(Utf8FrameValidator.java:77) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:335) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:327) 
    at io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler$1.channelRead(WebSocketServerProtocolHandler.java:159) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:335) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:327) 
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:335) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:327) 
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:288) 
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:262) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:335) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:327) 
    at io.netty.handler.logging.LoggingHandler.channelRead(LoggingHandler.java:233) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:335) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:327) 
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1336) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:335) 
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:911) 
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:123) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:544) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:485) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:399) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:371) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:742) 
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:145) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: com.google.protobuf.InvalidProtocolBufferException: While parsing a protocol message, the input ended unexpectedly in the middle of a field. This could mean either than the input has been truncated or that an embedded message misreported its own length. 
    at com.google.protobuf.InvalidProtocolBufferException.truncatedMessage(InvalidProtocolBufferException.java:70) 
    at com.google.protobuf.CodedInputStream.readRawBytesSlowPath(CodedInputStream.java:1187) 
    at com.google.protobuf.CodedInputStream.readBytes(CodedInputStream.java:517) 
    at com.google.protobuf.UnknownFieldSet$Builder.mergeFieldFrom(UnknownFieldSet.java:501) 
    at com.google.protobuf.UnknownFieldSet$Builder.mergeFrom(UnknownFieldSet.java:478) 
    at com.google.protobuf.UnknownFieldSet$Builder.mergeFrom(UnknownFieldSet.java:596) 
    at com.google.protobuf.UnknownFieldSet$Builder.mergeFrom(UnknownFieldSet.java:281) 
    at com.google.protobuf.CodedInputStream.readGroup(CodedInputStream.java:424) 
    at com.google.protobuf.UnknownFieldSet$Builder.mergeFieldFrom(UnknownFieldSet.java:505) 
    at com.google.protobuf.GeneratedMessage.parseUnknownField(GeneratedMessage.java:205) 
    at com.exmaple.MyProtoBufType.<init>(CallBreakProtocol.java:15290) 
    at com.exmaple.MyProtoBufType.<init>(CallBreakProtocol.java:15273) 
    at com.exmaple.MyProtoBufType$1.parsePartialFrom(CallBreakProtocol.java:15638) 
    at com.exmaple.MyProtoBufType$1.parsePartialFrom(CallBreakProtocol.java:1) 
    at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:137) 
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:168) 
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:174) 
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:49) 
    at io.netty.handler.codec.protobuf.ProtobufDecoder.decode(ProtobufDecoder.java:121) 
    at io.netty.handler.codec.protobuf.ProtobufDecoder.decode(ProtobufDecoder.java:64) 
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:88) 
    ... 52 more 

누구든지 Netty, ProtoBuf 및 WebSocket을 함께 사용 했습니까? 어떻게이 일을 성취 할 수 있습니까?

답변

0

나는 단지 다음 제거하기 위해 필요 -

pipeline.addLast(new ProtobufVarint32FrameDecoder()); 

하고 지금은 잘 작동된다.

관련 문제