【发布时间】:2014-12-20 07:58:08
【问题描述】:
我是使用 Netty 框架的新手。遇到一个问题,我用Netty写ServerSocket。 服务器的目标是从硬件接收消息。硬件每次发送一个字节。服务器和硬件有一个协议——每条消息都以“#”开头,以“*”结尾。
@Sharable
class ServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
BytBuf in = (ByteBuf) msg;
CharBuffer charBuffer = CharBuffer.allocate(100);
String recedata ;
byte tmp;
try {
while (in.isReadable()) {
tmp = in.readByte();
if (tmp != 42) {
charBuffer.append((char) tmp);
// System.out.println(String.valueOf(charBuffer.array()));
} else { //means receive a byte '*'
charBuffer.append('*');
count = 0;
recData = String.valueOf(charBuffer.array());
logger.debug("receive message is " + recData);
}
}catch(Exception e){
e.printStackTrace();
}
}
}
但是,出现了问题。当硬件第一次发送#abcd时,服务器将存储#abcd
然后硬件可能会发送efg*。由于Netty是异步的和事件驱动的,方法ChannelRead()会从头到尾运行。所以会打印efg*,而不是#abcdefg*
我想了很多。最后,我有一个想法。我使用AttribueKey 就像ThreadLocal 绑定一个数组以存储所有接收到的字节与通道。然后我从数组中得到#.....*。但数组会很大。这不是一个好方法。
你有更好的方法来解决我的问题吗?谢谢你的帮助
【问题讨论】:
标签: netty serversocket channel