如何在Netty中创建上下文

时间:2016-05-26 12:06:16

标签: java http netty

早上好,

在java.sun版本的http服务器中,我们用它来创建上下文和不同的处理程序:

server = HttpServer.create(new InetSocketAddress(PORT), 0);
    server.createContext("/@@getPersonalImage", new PersonalImageHandler());
    server.createContext("/@@getProfile", new ProfileGetter());

然后你可以通过输入

来达到它
 127.0.0.1:15000/@@getProfile

但是在netty中我认为我已经在示例等中搜索了所有内容,但还没有看到创建这样的上下文,这是某种被删除的方法还是什么?

你能帮助我在netty中实现这种背景吗?提前谢谢

1 个答案:

答案 0 :(得分:0)

Netty以这种方式运作。

  1. 您拥有必须设置的服务器和/或客户端,当您设置服务器时,您可以通过添加ChannelInitializer来添加处理程序。您也可以随时添加或删除,但并不总是建议这样做,因为它可能会很昂贵。
  2. 当您需要传递与之无关的数据或与您所读取的网络数据无关时,您可以采取多种方法,例如扩展处理程序并添加某些字段,您可以在其中访问或放置数据或使用ChannelAttributes。
  3. 他们的教程和示例在构建时非常有用。我将评论他们的例子并解释并希望这是有帮助的。

    From their User Guide Channels

    客户代码

    package io.netty.example.time;
    
    public class TimeClient {
        public static void main(String[] args) throws Exception {
            String host = args[0];
            int port = Integer.parseInt(args[1]);
            EventLoopGroup workerGroup = new NioEventLoopGroup();
    
            try {
                Bootstrap b = new Bootstrap(); 
                b.group(workerGroup); 
                b.channel(NioSocketChannel.class); 
                b.option(ChannelOption.SO_KEEPALIVE, true); 
                b.handler(new ChannelInitializer<SocketChannel>() {  //** This is the ChannelInitializer - The Channel is the nexus basically to communications, you add handlers to the channel in the order of how data is handled
                    @Override
                    public void initChannel(SocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new TimeClientHandler()); //** Here we are adding TimeClient Handler to the SocketChannel  seen below, there are many ways to add handlers 
                    }
                });
    
                // Start the client.
                ChannelFuture f = b.connect(host, port).sync(); // (5)
    
                // Wait until the connection is closed.
                f.channel().closeFuture().sync();
            } finally {
                workerGroup.shutdownGracefully();
            }
        }
    }
    

    处理程序代码

    package io.netty.example.time;
    
    import java.util.Date;
    
    public class TimeClientHandler extends ChannelInboundHandlerAdapter {
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            ByteBuf m = (ByteBuf) msg; // Here we are getting the message
            try {
                long currentTimeMillis = (m.readUnsignedInt() - 2208988800L) * 1000L; //** We will always have to write the logic unless there is already a netty handler for it, but even then you may or probably will have to implement business logic handler specific to your application(s)
                System.out.println(new Date(currentTimeMillis));
                ctx.close();  //** you can close a connection on a channel or a ChannelHandlerContext
            } finally {
                m.release(); //** Here you have to release the buffer
            }
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            cause.printStackTrace();
            ctx.close();
        }
    }
    

    因此,如果您希望能够伸出援手,那么在构建处理程序时,您可以添加自己的字段。对于属性方法,请参阅ChannelHandler以获取示例ChannelHandler

    编辑:是的,有一些Netty处理程序用于IP特定过滤,但我不确定具体。我不确定你要做什么,因为我不知道你提到的其他图书馆。为了让您了解我如何使用Netty可能会对您有所帮助。我有一个MMO风格的游戏,当客户端通过TCP w / SSL连接时,虽然在处理程序中我有一个我创建的Session类并跟踪所有信息。然后我通过自己的网络协议提示客户端使用TCP w / o SSL打开与服务器的另一个连接。我将它添加到他们的Session,然后我协商他们是否可以接收UDP,如果是,我为他们构建一个特定的UDP处理程序并将其附加到Session。每个Session在Handler中都有自己的处理程序实例,允许我从一个通道读写另一个通道并处理该人。每个会话还引用每个处理程序,通道和连接数据。我还有一个构建在http上的文件服务器和一个构建在netty中的post服务器,客户端实现了本机Java,因此我使用了web服务器而没有初始依赖。