如何在 Netty 中创建上下文

How to Create Context in 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 中也实现这种上下文吗?提前致谢

Netty 以这种方式工作。

  1. 您有必须设置的服务器 and/or 客户端,当您设置服务器时,您可以通过添加 ChannelInitializer 添加处理程序。您也可以即时添加或删除,但并不总是推荐这样做,因为它可能很昂贵。
  2. 当您需要将数据传入或传出与网络无关或与您读取的网络数据无关的数据时,您可以采用多种方法,例如扩展处理程序并添加某种可以访问或放置的字段数据或使用 ChannelAttributes.

他们的教程和示例在构建时绝对有帮助。我将评论他们的示例并进行解释,希望对您有所帮助。

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

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