私は Netty を初めて使いましたが、4.0.0 から始めることにしました。これは、より新しいため、より優れているはずだと考えたからです。私のサーバー アプリケーションは gps デバイスからデータを受信する必要があり、プロセスは次のようになります。デバイスからデータを受け取りたい場合。応答後、デバイスから AVL プロトコルで GPS データが送信されます。現在、私のサーバーは Netty なしで動作しており、netty で動作するように変更したいと考えています。これは私がやったことです:
このようなサーバークラスを作成しました
public class BusDataReceiverServer {
private final int port;
private final Logger LOG = LoggerFactory.getLogger(BusDataReceiverServer.class);
public BusDataReceiverServer(int port) {
this.port = port;
}
public void run() throws Exception {
LOG.info("running thread");
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try{
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new BusDataReceiverInitializer());
b.bind(port).sync().channel().closeFuture().sync();
}catch (Exception ex){
LOG.info(ex.getMessage());
}
finally {
LOG.info("thread closed");
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
new BusDataReceiverServer(3129).run();
}
}
そして作成された初期化クラス
public class BusDataReceiverInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast("imeiDecoder", new ImeiDecoder());
pipeline.addLast("busDataDecoder", new BusDataDecoder());
pipeline.addLast("encoder", new ResponceEncoder());
pipeline.addLast("imeiHandler", new ImeiReceiverServerHandler());
pipeline.addLast("busDataHandler", new BusDataReceiverServerHandler());
}
}
次に、デコーダーとエンコーダー、および 2 つのハンドラーを作成しました。私のimeiDecoderとエンコーダー、およびImeiReceiverServerHandlerは機能しています。これは私のImeiReceiverServerHandlerです
public class ImeiReceiverServerHandler extends ChannelInboundHandlerAdapter {
private final Logger LOG = LoggerFactory.getLogger(ImeiReceiverServerHandler.class);
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageList<Object> msgs) throws Exception {
MessageList<String> imeis = msgs.cast();
String imei = imeis.get(0);
ctx.write(Constants.BUS_DATA_ACCEPT);
ctx.fireMessageReceived(msgs);
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
super.channelInactive(ctx); //To change body of overridden methods use File | Settings | File Templates.
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
super.exceptionCaught(ctx, cause); //To change body of overridden methods use File | Settings | File Templates.
}
}
さて、受け入れた後、gpsデータを引き続き受信してハンドラーBusDataReceiverServerHandlerに転送する方法がわかりません。誰かがこれについて私を助けてくれたり、有用なドキュメントを提供してくれたりしたら、とても感謝しています。または、Netty 3 でこれを行うことができれば、これもありがたいです。