Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Netty-如何将所有帧从DelimiterBasedFrameDecoder提取到下一个处理程序_Java_Sockets_Handler_Netty - Fatal编程技术网

Java Netty-如何将所有帧从DelimiterBasedFrameDecoder提取到下一个处理程序

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

我试图通过使用Netty实现一个简单的niosocket服务器。我的信息来自gps跟踪器meitrack的MT90,我想用逗号直接分割它。因此,我在我自己的处理程序之前的channelpipeline中添加了DelimiterBaseSedFrameDecoder。大概是这样的:

@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