문제

맞춤 보안 정책이 포함 된 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;

Open JDK 구현에서 기본 소켓 한계는 1024입니다.http://www.docjar.com/html/api/sun/net/resourcemanager.java.html

도움이 되었습니까?

해결책

VM 주장이 도움이되었습니다.

-dsun.net.maxdatagramsockets = 101

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top