Могу ли я получить сокет Java по номеру дескриптора файла?
Когда программа запускается через FastCGI, она исполняется с уже открытым сокетом для связи с веб-сервером. Номер дескриптора файла сокета передается программе, но как это можно преобразовать во что-то полезное в Java, например в экземпляр Socket?
Мой хостинг использует mod_fastcgi для Apache httpd. Они не позволят мне настроить внешний сервер, на котором я предоставляю порт host: для пересылки запросов через FastCgiExternalServer.
2 ответа
Вы не можете сделать это на законных основаниях. Тем не менее, вы можете сделать взлом, как это (не пытайтесь сделать это дома). Вы можете прочитать из 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);
Что бы вы хотели Socket
за? Единственными полезными методами в сокете являются getInputStream и getOutputStream, но если вы работаете как CGI, у вас уже есть такие: они называются System.in и System.out.:)