当前位置: 首页 > 知识库问答 >
问题:

将低端口绑定到 Ubuntu 服务器上的 Java 程序

柳镜
2023-03-14

我有一个迷你侦听器/守护程序来捕获SNMP陷阱。这将在 tomcat7 上运行主项目(Spring网站)时执行侦听器。但我总是得到错误 java.net.绑定异常: 权限被拒绝

我尝试使用Authbind(http://java-notes.com/),但我的问题没有解决。我也尝试将端口更改为更大的端口,但我收到错误java.net.BindException:无法分配请求的地址

这是我的应用程序/陷阱接收器代码:

@Component
public class TrapReceiver extends Thread implements CommandResponder {

    @Inject
    private ApplicationContext applicationContext;

    @Inject
    private Executor executor;

    public TrapReceiver(){
    }

    List<PDUv1> listPdu = new ArrayList<PDUv1>();
    String message = "";
    long totReceivedTrap = 0;

    @PostConstruct
    public void init() {
        System.out.println("Running trap listener");
        this.start();
    }

    public synchronized void processPdu(CommandResponderEvent cmdRespEvent) {
        PDUv1 pdu = (PDUv1) cmdRespEvent.getPDU();
        listPdu.add(pdu);
        if (pdu != null) {
            if(listPdu.size() == 10){ //10 trap per thread
                List<PDUv1> temp = new ArrayList<PDUv1>();
                temp.addAll(listPdu);
                TrapInsertor trapInsertor = (TrapInsertor) applicationContext.getBean("trapInsertor");
                trapInsertor.setProperty(temp);
                executor.execute(trapInsertor);
                listPdu.clear();
            }
        }
    }

    public void run() {
        while (true) {
            try {
                this.listen(new UdpAddress(getIp()+"/162")); //alamat PDU akan listen
            } catch (Exception e) {
                e.printStackTrace();
            } 
        }
    }

    public synchronized void listen(TransportIpAddress address)
            throws IOException {
        AbstractTransportMapping transport;
        if (address instanceof TcpAddress) {
            transport = new DefaultTcpTransportMapping((TcpAddress) address);
        } else {
            transport = new DefaultUdpTransportMapping((UdpAddress) address);
        }

        ThreadPool threadPool = ThreadPool.create("DispatcherPool", 10);
        MessageDispatcher mDispathcher = new MultiThreadedMessageDispatcher(
                threadPool, new MessageDispatcherImpl());

        // add message processing models
        mDispathcher.addMessageProcessingModel(new MPv1());
        mDispathcher.addMessageProcessingModel(new MPv2c());

        // add all security protocols
        SecurityProtocols.getInstance().addDefaultProtocols();
        SecurityProtocols.getInstance().addPrivacyProtocol(new Priv3DES());

        // Create Target
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString("public"));

        Snmp snmp = new Snmp(mDispathcher, transport);
        snmp.addCommandResponder(this);

        transport.listen();
        System.out.println("Listening on " + address);

        try {
            this.wait();
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
    }

    //fungsi untuk mendapatkan real ip local (bukan 127.0.0.1)
    public static String getIp(){
        String ipAddress = null;
        Enumeration<NetworkInterface> net = null;
        try {
            net = NetworkInterface.getNetworkInterfaces();
        } catch (SocketException e) {
            throw new RuntimeException(e);
        }

        while(net.hasMoreElements()){
            NetworkInterface element = net.nextElement();
            Enumeration<InetAddress> addresses = element.getInetAddresses();
            while (addresses.hasMoreElements()){
                InetAddress ip = addresses.nextElement();
                if (ip instanceof Inet4Address){
                    if (ip.isSiteLocalAddress()){
                        ipAddress = ip.getHostAddress();
                    }
                }
            }
        }
        return ipAddress;
    }

}

共有3个答案

雷逸仙
2023-03-14

权限被拒绝是一个常见的异常,这意味着当前用户没有足够的访问权限打开端口。一种解决方案是,如果您将端口号更改为大于1024,则低于1024的端口称为特权端口,在Linux(以及大多数UNIX风格和类UNIX系统)中,任何非root用户都不允许打开这些端口。

金飞
2023-03-14

您应该使用超出 1024 范围的端口,因为它们是特权端口。尝试使用 1048 并在提供 SNMP 管理器详细信息时在应用程序中配置相同的端口。

羊禄
2023-03-14

您需要root才能绑定到Linux系统上的低端口。请确保以足够的权限运行Java应用程序。连接到高位端口时,请确保它尚未被其他进程/服务使用。

另请参阅绑定到 Debian/Ubuntu 上的特权端口,了解如何在 Ubuntu 上启用 AUTHBIND

 类似资料:
  • 本文向大家介绍Laravel 将单例绑定到服务容器,包括了Laravel 将单例绑定到服务容器的使用技巧和注意事项,需要的朋友参考一下 示例 我们可以将一个类绑定为Singleton: 这样,第一次将实例  'my-database'请求到服务容器时,将创建一个新实例。该类的所有后续请求都将返回第一个创建的实例:            

  • [eclipse-jetty]无法在端口9,091上启动jetty服务器:无法分配请求的地址 我正在使用jetty HTTP服务器发布REST Web服务。 配置: 服务器-ip : 20.121.21.22 端口: 8081 对于上述配置,它抛出以下异常。 org.apache.cxf.service.factory.ServiceConstructionException 原因:org . A

  • 问题内容: 我要对服务器进行编程,但是想知道我的想法是否可能。我的程序将在多个端口上输出到多个客户端-每个端口都可以由多个客户端访问。 通常,我会使用线程套接字服务器,但是在这种情况下,我需要它可用于多个端口。我想到的用法是下面一个模糊的伪代码: 启动服务器 侦听多个端口上的传入连接 识别正在连接的端口 如果是端口1,请启动一个线程以侦听客户端并输出消息类型 如果是端口2,请启动一个线程以侦听客户

  • 为主机绑定容器端口 默认情况下,Docker容器可以连接到外部区域,但外部区域不能连接到容器。在Docker启动时,由于它在主机上创建了一个iptables伪装规则,使得每一个输出连接看起来都是由主机IP地址建立起来的。 # You can see that the Docker server creates a # masquerade rule that let containers conn

  • 我在服务器(gae)中创建数据,并希望将其存储在BlobStore中。我看到了很多关于如何实现这一点的答案给客户机一个BlobStore URL,但是没有客户机或HTTP请求:这只是一个异步任务。 > 那么我想我应该使用createUploadUrl(),而不是将此URL提供给客户机,而是通过URL获取从我的代码HTTP将数据发布给它。这看起来很奇怪,不是有另外一个API吗? 假设我想要在Blob