所有 我将为服务器编写聊天室使用netty。并为客户端闪存。该协议使用带有“\ r \ n”end的json字符串。我写了三个处理程序“MessageDecoder”,“MessageHandler”,“MessageEncoder”。并使用flash客户端发送消息。但我得到以下错误。
java.lang.IllegalStateException: decode() method must read at least one byte if it returned a frame (caused by: class com.mbaobao.chatroom.socket.handlers.MessageDecoder)
at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:294)
at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:216)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:351)
at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:282)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:202)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
MessageDecoder
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer)
throws Exception {
logger.debug("message decode");
if (buffer.readableBytes() < 4) {
return null;
}
StringBuffer stringBuffer = new StringBuffer();
String json = null;
for (int i = 0; i < buffer.capacity(); i++) {
char c = (char) buffer.getByte(i);
logger.info(c);
stringBuffer.append(c);
if (c == 13 || c == 10) {
json = stringBuffer.toString();
break;
}
}
ChatData chatData = JSON.parseObject(json, ChatData.class);
return chatData;
}
我从不编写套接字程序。只知道使用mutil线程管理套接字。但我认为这太可怕了。所以我用netty。但我不知道如何将它用于聊天室。
任何人都可以给我推荐?
答案 0 :(得分:1)
确保将收到的ChannelBuffer的阅读器索引定位到刚刚读取的消息结束的位置。 @see ChannelBuffer.readerIndex(int)这是因为ChannelBuffer.getByte(int)/ .getBytes()不会改变读者索引。
如果不这样做,Netty将假设您没有从缓冲区中读取任何字节(如果有的话,将其交给管道中的下一个处理程序)并抛出您刚刚遇到的例外情况。
答案 1 :(得分:1)
只需将buffer.getByte(..)替换为buffer.readByte()即可解决此问题。
答案 2 :(得分:0)
我建议您使用内置功能来处理提供的字符串 在Netty API中。
DelimiterBasedFrameDecoder
StringDecoder
StringEncoder
我尝试创建指向相应文档页面的链接,但stackoverflow会阻止 我发布了两个以上的链接。
Netty SecureChat Example为您提供了如何使用这些处理程序的非常明确的解释 渠道管道。