سؤال

لدي تطبيق 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)

كيف يمكنني تغيير حد المقبس أثناء استخدام مدير الأمان؟

تحديث: تم استنساخه على 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 المفتوح ، يكون الحد الافتراضي للمقبس هو 1024http://www.docjar.com/html/api/sun/net/resourcemanager.java.html

هل كانت مفيدة؟

المحلول

ساعدت حجة VM هذه:

-dsun.net.maxdatagramsockets = 101

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top