Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/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中拒绝传入连接?_Java_Netty - Fatal编程技术网

Java 如何在Netty中拒绝传入连接?

Java 如何在Netty中拒绝传入连接?,java,netty,Java,Netty,我有一个Netty TCP服务器,我希望有选择地拒绝/拒绝传入的连接尝试(基于它们的远程地址)。我想我必须使用ServerBootstrap.setParentHandler(ChannelHandler),但是在ChannelHandler中我该怎么做呢?我在处理什么事件?如何拒绝连接?如果您有多个网络接口,并且只想从一个接口接受连接,则只需在服务器引导中设置本地地址即可。如果您的服务器运行在连接到多个网络的机器上,并且您只想为其中一个网络提供服务,那么这就足够了。在这种情况下,操作系统将拒绝

我有一个Netty TCP服务器,我希望有选择地拒绝/拒绝传入的连接尝试(基于它们的远程地址)。我想我必须使用
ServerBootstrap.setParentHandler(ChannelHandler)
,但是在
ChannelHandler
中我该怎么做呢?我在处理什么事件?如何拒绝连接?

如果您有多个网络接口,并且只想从一个接口接受连接,则只需在
服务器引导中设置本地地址即可。如果您的服务器运行在连接到多个网络的机器上,并且您只想为其中一个网络提供服务,那么这就足够了。在这种情况下,操作系统将拒绝来自其他网络的任何连接尝试

一旦你在应用层建立了一个连接,拒绝它就太晚了。你能做的最好的事情就是立即关闭它


例如,如果您希望服务器仅在本地主机上可用且对外部世界不可见,这就足够了:环回网络127.0.0.0/8由单独的接口提供服务。

在查看netty源文件中的
org.jboss.netty.channel.socket.nio.nioserverssocketpipelinesink
之后,我相当确定Netty接受所有传入的连接,并且没有办法拒绝它们(当然,它们可以在被接受后关闭)。

正如Norman所说,没有办法拒绝连接,但是您可以通过将Netty的IpFilterHandler作为第一个处理程序添加到服务器管道中来立即关闭连接。它还将停止传播过滤连接的上游通道状态事件

@ChannelHandler.Sharable
public class MyFilterHandler extends IpFilteringHandlerImpl {
  private final Set<InetSocketAddress> deniedRemoteAddress;

  public MyFilterHandler(Set<InetSocketAddress> deniedRemoteAddress) {
    this.deniedRemoteAddress = deniedRemoteAddress;
  }

  @Override
  protected boolean accept(ChannelHandlerContext ctx, ChannelEvent e, InetSocketAddress inetSocketAddress) throws Exception {
    return !deniedRemoteAddress.contains(inetSocketAddress);
  }
}

正确的。但有没有办法拒绝与Netty的联系?(同样,我确信这与
ServerBootstrap.setParentHandler()
有关)编辑后注意到,如果您有多个网络接口,您可以只绑定一个,让操作系统拒绝其他接口上的连接。据我所知,无法从套接字API级别选择性地拒绝来自端口的传入连接。也许您需要配置iptables或类似的东西。
//Example: allow only localhost:
new IPFilterRuleHandler().addAll(new IpFilterRuleList("+n:localhost, -n:*"))