Java Netty-如何将所有帧从DelimiterBasedFrameDecoder提取到下一个处理程序
我试图通过使用Netty实现一个简单的niosocket服务器。我的信息来自gps跟踪器meitrack的MT90,我想用逗号直接分割它。因此,我在我自己的处理程序之前的channelpipeline中添加了DelimiterBaseSedFrameDecoder。大概是这样的:Java Netty-如何将所有帧从DelimiterBasedFrameDecoder提取到下一个处理程序,java,sockets,handler,netty,Java,Sockets,Handler,Netty,我试图通过使用Netty实现一个简单的niosocket服务器。我的信息来自gps跟踪器meitrack的MT90,我想用逗号直接分割它。因此,我在我自己的处理程序之前的channelpipeline中添加了DelimiterBaseSedFrameDecoder。大概是这样的: @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.p
@Override
protected void initChannel(SocketChannel ch) throws Exception
{
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("framer", new DelimiterBasedFrameDecoder(65 * 1024, delimiter));
//pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
//pipeline.addLast("encoder",new StringEncoder(CharsetUtil.UTF_8));
pipeline.addLast(new TrackingServerHandler());
}
我的问题是,我不知道如何管理处理程序中拆分的消息,我只是尝试在控制台上显示它,但似乎我只能在第一个帧上访问,需要做更多的工作来处理所有这些。
这是我的TrackingServerHandler中的示例代码:
import java.nio.charset.Charset;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
public class TrackingServerHandler extends SimpleChannelInboundHandler<ByteBuf>
{
Charset utf8 = Charset.forName("UTF-8");
@Override
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf buf) throws Exception
{
String message = buf.toString(utf8);
System.out.println("Message received :\n"+ message);
}
}
import java.nio.charset.charset;
导入io.netty.buffer.ByteBuf;
导入io.netty.channel.ChannelHandlerContext;
导入io.netty.channel.SimpleChannelInboundHandler;
公共类TrackingServerHandler扩展了SimpleChannelInboundHandler
{
字符集utf8=Charset.forName(“UTF-8”);
@凌驾
受保护的无效channelRead0(ChannelHandlerContext ctx,ByteBuf buf)引发异常
{
字符串消息=buf.toString(utf8);
System.out.println(“收到的消息:\n”+消息);
}
}
你能帮我吗?我是Netty的新手。DelimiterBaseFrameDecoder每次只返回一帧。我认为您应该实现一个
MessageToMessageDecoder
并自己构造消息。(假设输出数据为GPSData)
以下是示例:
class MyDecoder extends MessageToMessageDecoder<ByteBuf> {
protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) {
String something = msg.toString(charset);
String[] items = something.split(",");
// Construct GPSData with items
GPSData data = new GPSData();
data.latitude = items[0];// whatever
out.add(data);
}
}
有人帮不了我吗?
public class TrackingServerHandler extends SimpleChannelInboundHandler<GPSData>
{
@Override
protected void channelRead0(ChannelHandlerContext ctx, GPSData data) throws Exception
{
// the data is what I want
}
}
1,2,3,4,5,6\n
7,8,9,0,1,2