java - 启用 java 安全管理器限制 udp 套接字数

标签 java sockets policy securitymanager

我有一个带有自定义安全策略的 java 应用程序,当我尝试打开 100 个 udp 套接字时出现异常:

java.net.SocketException: maximum number of DatagramSockets reached

测试应用:

import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.util.ArrayList;
import java.util.List;   

public class Test {
    static int basePortNum = 40000; 
    public static void main(String[] args) {
        List<DatagramSocket> socks = new ArrayList<DatagramSocket>();
        try{
            for(int i = 0; i<100; i++){
                socks.add(new DatagramSocket(basePortNum+i, Inet4Address.getByName("127.0.0.1")) );
                System.out.println(i);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            for(java.net.DatagramSocket soc: socks){
                soc.close();
            }
        }    
    }    
}

如果我在没有安全管理器的情况下启动它,它会创建所有 100 个套接字:

0
1
...
98
99

但是如果我将这一行添加到 VM 参数中

-Djava.security.manager

即使使用默认安全策略也会失败:

0
1
...
23
24
java.net.SocketException: maximum number of DatagramSockets reached
    at sun.net.ResourceManager.beforeUdpCreate(ResourceManager.java:53)
    at java.net.PlainDatagramSocketImpl.create(PlainDatagramSocketImpl.java:74)
    at java.net.DatagramSocket.createImpl(DatagramSocket.java:318)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:209)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:262)
    at Test.main(Test.java:16)

如何在使用安全管理器时更改套接字限制?

UPD:它在 windows 8.1 x64、windows 7 x64 和 windows xp sp3 x32、windows 7 x32 上重现。在所有系统上都使用了 JDK 1.6.45 x32。

UPD2:在 Windows xp sp3 x32 上也用 JDK7 重现,但不能用 JDK 1.6.27 重现。

UPD3:调试 JDK 类时发现:

// Compiled from ResourceManager.java (version 1.5 : 49.0, super bit)
public class sun.net.ResourceManager {

  // Field descriptor #14 I
  private static final int DEFAULT_MAX_SOCKETS = 25;

在开放式 JDK 实现中,默认套接字限制为 1024 http://www.docjar.com/html/api/sun/net/ResourceManager.java.html

最佳答案

VM 论点有帮助:

-Dsun.net.maxDatagramSockets=101

关于java - 启用 java 安全管理器限制 udp 套接字数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19839194/

相关文章:

java - Wicket FileUploadField 和大型 zip 上传

c - 服务器突然终止(非套接字上的套接字操作)

php - 如何将Android客户端连接到ReactPHP套接字服务器

java - 使用 WebDriver 在基于 CSS 的菜单中选择一个选项

java - 为什么 HashMap.Entry 类有一个哈希字段?

java - 我如何在java中选择哪个端口可以免费用于ServerSocket或Socket?

azure - 当功能分支使用不同的构建管道时,将功能分支合并到主分支的最佳方法是什么?

android - 应用程序因垃圾邮件和商店放置而暂停

Facebook游戏政策改变

Java任务什么都不做?