早上好,
在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中实现这种背景吗?提前谢谢答案 0 :(得分:0)
Netty以这种方式运作。
他们的教程和示例在构建时非常有用。我将评论他们的例子并解释并希望这是有帮助的。
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服务器而没有初始依赖。