object message sent with Netty can't be decoded correctly











up vote
0
down vote

favorite












I try to send object message PingMessage with netty. Add ObjectEncoder and ObjectDecoder in channel pipeline. Client has sent packet successfully, but server can't decode the message. ObjectDecoder#decode() just returns null. Netty version is 4.1.28.Final.



PingMessage



public class PingMessage implements Serializable {
private static final long serialVersionUID = 1L;
private int flag = 0xff3e;
private String ping = "ping";

public int getFlag() {
return flag;
}

public void setFlag(int flag) {
this.flag = flag;
}

public String getPing() {
return ping;
}

public void setPing(String ping) {
this.ping = ping;
}
}


client



public class HeartbeatInitializer extends ChannelInitializer<Channel> {

protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ObjectEncoder());
pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.weakCachingResolver(PongMessage.class.getClassLoader())));
pipeline.addLast(new IdleStateHandler(BusinessConstant.READER_IDLE_SECONDS, BusinessConstant.WRITER_IDLE_SECONDS, 0));
pipeline.addLast(new HeartbeatServerHandler());
pipeline.addLast(new ClientHandler());
}
}

public class HeartbeatServerHandler extends ChannelDuplexHandler {
private static Logger logger = LoggerFactory.getLogger(HeartbeatServerHandler.class);

@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent idleState = (IdleStateEvent)evt;
if (idleState.state() == IdleState.READER_IDLE) {
} else if (idleState.state() == IdleState.WRITER_IDLE) {
try {
ChannelFuture future = ctx.writeAndFlush(new PingMessage()).sync();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}


server



public class HeartbeatInitializer extends ChannelInitializer<Channel> {

protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ObjectEncoder());
pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.weakCachingResolver(this.class.getClassLoader())));
pipeline.addLast(new IdleStateHandler(BusinessConstant.READER_IDLE_SECONDS, BusinessConstant.WRITER_IDLE_SECONDS, 0));
pipeline.addLast(new HeartbeatServerHandler());
pipeline.addLast(new ClientHandler());
}
}

public class HeartbeatServerHandler extends ChannelDuplexHandler {
private static Logger logger = LoggerFactory.getLogger(HeartbeatServerHandler.class);

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof PingMessage) {
logger.info("received ping");
return;
}
}
}


netty source code debug info



AbstractChannelHandlerContext#invokeChannelRead()



((ChannelInboundHandler) handler()).channelRead(this, msg);


the msg variable is




UnpooledUnsafeDirectByteBuf(ridx: 0, widx: 61, cap: 1024)




ObjectDecoder#decode() just return null



super class of ObjectDecoder is LengthFieldBasedFrameDecoder. LengthFieldBasedFrameDecoder#decode() return null



// LengthFieldBasedFrameDecoder#decode()

int frameLengthInt = (int) frameLength;
if (in.readableBytes() < frameLengthInt) {
return null; // get executed and return null
}









share|improve this question
























  • We will need more infos but just let me say that ChannelFuture future = ctx.writeAndFlush(new PingMessage()).sync(); will not work (and should even produce an exception) as you block the EventLoop. You should never call sync* or await* in the EventLoop
    – Norman Maurer
    Nov 15 at 6:46










  • @NormanMaurer I've debugged the client code and no exception found. I use wireshark to capture packets and find "ping" packet which is 61 bytes. But the server just can't decode bytes to PingMessage. How can I provide more infomation? I don't post code about PongMessage(from server to client), which can be decoded well by client. Does Netty support both directions message processing?
    – Hel
    Nov 15 at 6:49












  • @NormanMaurer I add sync() for debug purpose to assure that messages written without exception.
    – Hel
    Nov 15 at 6:56










  • 1. You didn't add a LengthFieldBasedFrameDecoder in your ChannelInitializer but mentioned it in your question. Why? 2. I tried your code and for me everything woks fine. Maybe you imported something wrong since all your classes have the same name.
    – Ingrim4
    Nov 15 at 13:17






  • 1




    Are you sure you have the same version of the serializable class on both class-path. ?
    – Norman Maurer
    Nov 16 at 16:29















up vote
0
down vote

favorite












I try to send object message PingMessage with netty. Add ObjectEncoder and ObjectDecoder in channel pipeline. Client has sent packet successfully, but server can't decode the message. ObjectDecoder#decode() just returns null. Netty version is 4.1.28.Final.



PingMessage



public class PingMessage implements Serializable {
private static final long serialVersionUID = 1L;
private int flag = 0xff3e;
private String ping = "ping";

public int getFlag() {
return flag;
}

public void setFlag(int flag) {
this.flag = flag;
}

public String getPing() {
return ping;
}

public void setPing(String ping) {
this.ping = ping;
}
}


client



public class HeartbeatInitializer extends ChannelInitializer<Channel> {

protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ObjectEncoder());
pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.weakCachingResolver(PongMessage.class.getClassLoader())));
pipeline.addLast(new IdleStateHandler(BusinessConstant.READER_IDLE_SECONDS, BusinessConstant.WRITER_IDLE_SECONDS, 0));
pipeline.addLast(new HeartbeatServerHandler());
pipeline.addLast(new ClientHandler());
}
}

public class HeartbeatServerHandler extends ChannelDuplexHandler {
private static Logger logger = LoggerFactory.getLogger(HeartbeatServerHandler.class);

@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent idleState = (IdleStateEvent)evt;
if (idleState.state() == IdleState.READER_IDLE) {
} else if (idleState.state() == IdleState.WRITER_IDLE) {
try {
ChannelFuture future = ctx.writeAndFlush(new PingMessage()).sync();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}


server



public class HeartbeatInitializer extends ChannelInitializer<Channel> {

protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ObjectEncoder());
pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.weakCachingResolver(this.class.getClassLoader())));
pipeline.addLast(new IdleStateHandler(BusinessConstant.READER_IDLE_SECONDS, BusinessConstant.WRITER_IDLE_SECONDS, 0));
pipeline.addLast(new HeartbeatServerHandler());
pipeline.addLast(new ClientHandler());
}
}

public class HeartbeatServerHandler extends ChannelDuplexHandler {
private static Logger logger = LoggerFactory.getLogger(HeartbeatServerHandler.class);

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof PingMessage) {
logger.info("received ping");
return;
}
}
}


netty source code debug info



AbstractChannelHandlerContext#invokeChannelRead()



((ChannelInboundHandler) handler()).channelRead(this, msg);


the msg variable is




UnpooledUnsafeDirectByteBuf(ridx: 0, widx: 61, cap: 1024)




ObjectDecoder#decode() just return null



super class of ObjectDecoder is LengthFieldBasedFrameDecoder. LengthFieldBasedFrameDecoder#decode() return null



// LengthFieldBasedFrameDecoder#decode()

int frameLengthInt = (int) frameLength;
if (in.readableBytes() < frameLengthInt) {
return null; // get executed and return null
}









share|improve this question
























  • We will need more infos but just let me say that ChannelFuture future = ctx.writeAndFlush(new PingMessage()).sync(); will not work (and should even produce an exception) as you block the EventLoop. You should never call sync* or await* in the EventLoop
    – Norman Maurer
    Nov 15 at 6:46










  • @NormanMaurer I've debugged the client code and no exception found. I use wireshark to capture packets and find "ping" packet which is 61 bytes. But the server just can't decode bytes to PingMessage. How can I provide more infomation? I don't post code about PongMessage(from server to client), which can be decoded well by client. Does Netty support both directions message processing?
    – Hel
    Nov 15 at 6:49












  • @NormanMaurer I add sync() for debug purpose to assure that messages written without exception.
    – Hel
    Nov 15 at 6:56










  • 1. You didn't add a LengthFieldBasedFrameDecoder in your ChannelInitializer but mentioned it in your question. Why? 2. I tried your code and for me everything woks fine. Maybe you imported something wrong since all your classes have the same name.
    – Ingrim4
    Nov 15 at 13:17






  • 1




    Are you sure you have the same version of the serializable class on both class-path. ?
    – Norman Maurer
    Nov 16 at 16:29













up vote
0
down vote

favorite









up vote
0
down vote

favorite











I try to send object message PingMessage with netty. Add ObjectEncoder and ObjectDecoder in channel pipeline. Client has sent packet successfully, but server can't decode the message. ObjectDecoder#decode() just returns null. Netty version is 4.1.28.Final.



PingMessage



public class PingMessage implements Serializable {
private static final long serialVersionUID = 1L;
private int flag = 0xff3e;
private String ping = "ping";

public int getFlag() {
return flag;
}

public void setFlag(int flag) {
this.flag = flag;
}

public String getPing() {
return ping;
}

public void setPing(String ping) {
this.ping = ping;
}
}


client



public class HeartbeatInitializer extends ChannelInitializer<Channel> {

protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ObjectEncoder());
pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.weakCachingResolver(PongMessage.class.getClassLoader())));
pipeline.addLast(new IdleStateHandler(BusinessConstant.READER_IDLE_SECONDS, BusinessConstant.WRITER_IDLE_SECONDS, 0));
pipeline.addLast(new HeartbeatServerHandler());
pipeline.addLast(new ClientHandler());
}
}

public class HeartbeatServerHandler extends ChannelDuplexHandler {
private static Logger logger = LoggerFactory.getLogger(HeartbeatServerHandler.class);

@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent idleState = (IdleStateEvent)evt;
if (idleState.state() == IdleState.READER_IDLE) {
} else if (idleState.state() == IdleState.WRITER_IDLE) {
try {
ChannelFuture future = ctx.writeAndFlush(new PingMessage()).sync();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}


server



public class HeartbeatInitializer extends ChannelInitializer<Channel> {

protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ObjectEncoder());
pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.weakCachingResolver(this.class.getClassLoader())));
pipeline.addLast(new IdleStateHandler(BusinessConstant.READER_IDLE_SECONDS, BusinessConstant.WRITER_IDLE_SECONDS, 0));
pipeline.addLast(new HeartbeatServerHandler());
pipeline.addLast(new ClientHandler());
}
}

public class HeartbeatServerHandler extends ChannelDuplexHandler {
private static Logger logger = LoggerFactory.getLogger(HeartbeatServerHandler.class);

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof PingMessage) {
logger.info("received ping");
return;
}
}
}


netty source code debug info



AbstractChannelHandlerContext#invokeChannelRead()



((ChannelInboundHandler) handler()).channelRead(this, msg);


the msg variable is




UnpooledUnsafeDirectByteBuf(ridx: 0, widx: 61, cap: 1024)




ObjectDecoder#decode() just return null



super class of ObjectDecoder is LengthFieldBasedFrameDecoder. LengthFieldBasedFrameDecoder#decode() return null



// LengthFieldBasedFrameDecoder#decode()

int frameLengthInt = (int) frameLength;
if (in.readableBytes() < frameLengthInt) {
return null; // get executed and return null
}









share|improve this question















I try to send object message PingMessage with netty. Add ObjectEncoder and ObjectDecoder in channel pipeline. Client has sent packet successfully, but server can't decode the message. ObjectDecoder#decode() just returns null. Netty version is 4.1.28.Final.



PingMessage



public class PingMessage implements Serializable {
private static final long serialVersionUID = 1L;
private int flag = 0xff3e;
private String ping = "ping";

public int getFlag() {
return flag;
}

public void setFlag(int flag) {
this.flag = flag;
}

public String getPing() {
return ping;
}

public void setPing(String ping) {
this.ping = ping;
}
}


client



public class HeartbeatInitializer extends ChannelInitializer<Channel> {

protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ObjectEncoder());
pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.weakCachingResolver(PongMessage.class.getClassLoader())));
pipeline.addLast(new IdleStateHandler(BusinessConstant.READER_IDLE_SECONDS, BusinessConstant.WRITER_IDLE_SECONDS, 0));
pipeline.addLast(new HeartbeatServerHandler());
pipeline.addLast(new ClientHandler());
}
}

public class HeartbeatServerHandler extends ChannelDuplexHandler {
private static Logger logger = LoggerFactory.getLogger(HeartbeatServerHandler.class);

@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent idleState = (IdleStateEvent)evt;
if (idleState.state() == IdleState.READER_IDLE) {
} else if (idleState.state() == IdleState.WRITER_IDLE) {
try {
ChannelFuture future = ctx.writeAndFlush(new PingMessage()).sync();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}


server



public class HeartbeatInitializer extends ChannelInitializer<Channel> {

protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ObjectEncoder());
pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.weakCachingResolver(this.class.getClassLoader())));
pipeline.addLast(new IdleStateHandler(BusinessConstant.READER_IDLE_SECONDS, BusinessConstant.WRITER_IDLE_SECONDS, 0));
pipeline.addLast(new HeartbeatServerHandler());
pipeline.addLast(new ClientHandler());
}
}

public class HeartbeatServerHandler extends ChannelDuplexHandler {
private static Logger logger = LoggerFactory.getLogger(HeartbeatServerHandler.class);

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof PingMessage) {
logger.info("received ping");
return;
}
}
}


netty source code debug info



AbstractChannelHandlerContext#invokeChannelRead()



((ChannelInboundHandler) handler()).channelRead(this, msg);


the msg variable is




UnpooledUnsafeDirectByteBuf(ridx: 0, widx: 61, cap: 1024)




ObjectDecoder#decode() just return null



super class of ObjectDecoder is LengthFieldBasedFrameDecoder. LengthFieldBasedFrameDecoder#decode() return null



// LengthFieldBasedFrameDecoder#decode()

int frameLengthInt = (int) frameLength;
if (in.readableBytes() < frameLengthInt) {
return null; // get executed and return null
}






java netty






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 15 at 15:16

























asked Nov 15 at 1:24









Hel

10218




10218












  • We will need more infos but just let me say that ChannelFuture future = ctx.writeAndFlush(new PingMessage()).sync(); will not work (and should even produce an exception) as you block the EventLoop. You should never call sync* or await* in the EventLoop
    – Norman Maurer
    Nov 15 at 6:46










  • @NormanMaurer I've debugged the client code and no exception found. I use wireshark to capture packets and find "ping" packet which is 61 bytes. But the server just can't decode bytes to PingMessage. How can I provide more infomation? I don't post code about PongMessage(from server to client), which can be decoded well by client. Does Netty support both directions message processing?
    – Hel
    Nov 15 at 6:49












  • @NormanMaurer I add sync() for debug purpose to assure that messages written without exception.
    – Hel
    Nov 15 at 6:56










  • 1. You didn't add a LengthFieldBasedFrameDecoder in your ChannelInitializer but mentioned it in your question. Why? 2. I tried your code and for me everything woks fine. Maybe you imported something wrong since all your classes have the same name.
    – Ingrim4
    Nov 15 at 13:17






  • 1




    Are you sure you have the same version of the serializable class on both class-path. ?
    – Norman Maurer
    Nov 16 at 16:29


















  • We will need more infos but just let me say that ChannelFuture future = ctx.writeAndFlush(new PingMessage()).sync(); will not work (and should even produce an exception) as you block the EventLoop. You should never call sync* or await* in the EventLoop
    – Norman Maurer
    Nov 15 at 6:46










  • @NormanMaurer I've debugged the client code and no exception found. I use wireshark to capture packets and find "ping" packet which is 61 bytes. But the server just can't decode bytes to PingMessage. How can I provide more infomation? I don't post code about PongMessage(from server to client), which can be decoded well by client. Does Netty support both directions message processing?
    – Hel
    Nov 15 at 6:49












  • @NormanMaurer I add sync() for debug purpose to assure that messages written without exception.
    – Hel
    Nov 15 at 6:56










  • 1. You didn't add a LengthFieldBasedFrameDecoder in your ChannelInitializer but mentioned it in your question. Why? 2. I tried your code and for me everything woks fine. Maybe you imported something wrong since all your classes have the same name.
    – Ingrim4
    Nov 15 at 13:17






  • 1




    Are you sure you have the same version of the serializable class on both class-path. ?
    – Norman Maurer
    Nov 16 at 16:29
















We will need more infos but just let me say that ChannelFuture future = ctx.writeAndFlush(new PingMessage()).sync(); will not work (and should even produce an exception) as you block the EventLoop. You should never call sync* or await* in the EventLoop
– Norman Maurer
Nov 15 at 6:46




We will need more infos but just let me say that ChannelFuture future = ctx.writeAndFlush(new PingMessage()).sync(); will not work (and should even produce an exception) as you block the EventLoop. You should never call sync* or await* in the EventLoop
– Norman Maurer
Nov 15 at 6:46












@NormanMaurer I've debugged the client code and no exception found. I use wireshark to capture packets and find "ping" packet which is 61 bytes. But the server just can't decode bytes to PingMessage. How can I provide more infomation? I don't post code about PongMessage(from server to client), which can be decoded well by client. Does Netty support both directions message processing?
– Hel
Nov 15 at 6:49






@NormanMaurer I've debugged the client code and no exception found. I use wireshark to capture packets and find "ping" packet which is 61 bytes. But the server just can't decode bytes to PingMessage. How can I provide more infomation? I don't post code about PongMessage(from server to client), which can be decoded well by client. Does Netty support both directions message processing?
– Hel
Nov 15 at 6:49














@NormanMaurer I add sync() for debug purpose to assure that messages written without exception.
– Hel
Nov 15 at 6:56




@NormanMaurer I add sync() for debug purpose to assure that messages written without exception.
– Hel
Nov 15 at 6:56












1. You didn't add a LengthFieldBasedFrameDecoder in your ChannelInitializer but mentioned it in your question. Why? 2. I tried your code and for me everything woks fine. Maybe you imported something wrong since all your classes have the same name.
– Ingrim4
Nov 15 at 13:17




1. You didn't add a LengthFieldBasedFrameDecoder in your ChannelInitializer but mentioned it in your question. Why? 2. I tried your code and for me everything woks fine. Maybe you imported something wrong since all your classes have the same name.
– Ingrim4
Nov 15 at 13:17




1




1




Are you sure you have the same version of the serializable class on both class-path. ?
– Norman Maurer
Nov 16 at 16:29




Are you sure you have the same version of the serializable class on both class-path. ?
– Norman Maurer
Nov 16 at 16:29

















active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53311147%2fobject-message-sent-with-netty-cant-be-decoded-correctly%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown






























active

oldest

votes













active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53311147%2fobject-message-sent-with-netty-cant-be-decoded-correctly%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

How to change which sound is reproduced for terminal bell?

Can I use Tabulator js library in my java Spring + Thymeleaf project?

Title Spacing in Bjornstrup Chapter, Removing Chapter Number From Contents