【问题标题】:How can I make sure that the port I want to use is always available (i.e. not in use)?如何确保我要使用的端口始终可用(即未使用)?
【发布时间】:2012-03-04 20:18:00
【问题描述】:

有没有办法强制释放端口?端口通过 args[] 传递。 我正在尝试构建一个等待来自多个设备的 UDP 数据包的服务器应用程序,所以我不想确保它总是会监听适当的端口。来自数据包的数据将被处理并将结果写入数据库。我正在使用 while(true) 循环来保持它监听新数据包。当多个设备(比如 2000 年)同时发送时,我可能会遇到并发问题吗?除了使用 while(true) 还有其他方法吗?有什么建议吗?

编辑(主题可能不正确) 我正在使用这些方法来转换 2 字节和 4 字节长度的有符号二进制补码。我找不到更简单的方法...

public static Long twosComp16(String str) throws java.lang.Exception
    {
        Long num = Long.valueOf(str, 16);

        int fix = 65536;

        if (num > (fix/2))
            return num - fix;
        else return num;
    }
    public static Long twosComp32(String str) throws java.lang.Exception
    {
        Long num = Long.valueOf(str, 16);

        long fix = 4294967296L;

        if (num > (fix/2))
            return num - fix;
        else return num;
    }

【问题讨论】:

    标签: java sockets network-programming udp datagram


    【解决方案1】:
    1. 我认为您不能强制释放端口。无论如何,这取决于用户。尽量不要为用户做选择;而是问他/她。是什么让您认为您的应用程序比在该端口上运行的其他应用程序更重要? ;)
    2. while(running)
    3. 如果您要进行繁重的处理,请让您的服务器为每个客户端生成一个线程,而不是只有一个处理而其他处理等待。

    【讨论】:

    • 好吧,我不认为处理很繁重,它主要包括在数据包上查找某些字节并将它们的值作为 int 或 long (我正在使用 GPS 参数,如 lat、long 、alt、速度、时间戳等)。并在此之后向设备返回一个 ACK​​ 数据包。
    • 即便如此,如果您有成千上万的客户,您可能会遇到麻烦。无论如何,通常最好为每个客户端生成一个线程。正如西班牙语所说:“预防胜于治疗”。
    • 我猜最大线程数取决于硬件,所以如果我打算将应用程序与定期发送数据包的不相关客户端一起使用,比如 10'000,它会设置一些要求对于将托管它的机器,对吗?
    • 其实我认为硬件设置的线程数没有任何限制。但是如果内存太多,系统就会耗尽内存或运行太慢,甚至崩溃。同样在返回 ACK 之后,你会杀死线程,所以我认为如果处理速度如你所说的那样快,那么在给定的时刻你不会有太多的线程在运行。硬件要求显然取决于您获得的负载。最好先对增加的客户进行一些测试,看看它对给定数量的客户的表现如何,然后再做出决定。
    • 问题是我不确定速度。我只是猜测它很快,但为了方便起见(并且由于我刚开始使用java而缺乏知识)我将数据包有效负载转换为字符串,将字符串转换为十六进制数组,然后我使用十六进制字符来做计算/转换...我还发现使用十六进制表示法更容易编写 ACK。我相信有一种我还不知道的更快的方法。
    【解决方案2】:

    有没有办法强制释放端口

    不,因为如果两个程序都要求一个端口是空闲的,会发生什么?最终,第二个想要端口的程序一定是不满足的。

    【讨论】:

    • 那我得手动在代码中设置端口了。我在应用程序中使用了硬编码的端口 5556 和 5558,到目前为止没有任何问题。
    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    相关资源
    最近更新 更多