Могу ли я получить сокет Java по номеру дескриптора файла? - PullRequest
0 голосов
/ 07 августа 2009

Когда программа запускается через FastCGI, она исполняется с уже открытым сокетом для связи с веб-сервером. Номер дескриптора файла сокета передается программе, но как это можно преобразовать во что-нибудь полезное в Java, например в экземпляр Socket?

Мой хостинг использует mod_fastcgi для Apache httpd. Они не позволят мне настроить внешний сервер, на котором я предоставляю порт host: для пересылки запросов через FastCgiExternalServer.

Ответы [ 2 ]

1 голос
/ 07 августа 2009

Вы не можете сделать это на законных основаниях. Тем не менее, вы можете сделать взлом, как это (не пытайтесь сделать это дома). Вы можете читать с is и писать на os.

    Class<FileDescriptor> clazz = FileDescriptor.class;

    Constructor<FileDescriptor> c;
    try {
        c = clazz.getDeclaredConstructor(new Class[] { Integer.TYPE });
    } catch (SecurityException e) {
        e.printStackTrace();
        return;
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
        return;
    }

    c.setAccessible(true);
    FileDescriptor fd;
    try {
        fd = c.newInstance(new Integer(socket));
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        return;
    } catch (InstantiationException e) {
        e.printStackTrace();
        return;
    } catch (IllegalAccessException e) {
        e.printStackTrace();
        return;
    } catch (InvocationTargetException e) {
        e.printStackTrace();
        return;
    }

    FileOutputStream os = new FileOutputStream(fd);
            FileInputStream is = new FileInputStream(fd);
1 голос
/ 07 августа 2009

Что бы вы хотели Socket для? Единственными полезными методами в сокете являются getInputStream и getOutputStream , но если вы работаете как CGI, у вас уже есть такие: они называются System.in и System.out . :)

...