【问题标题】:Can I get a Java Socket from a file descriptor number?我可以从文件描述符编号中获取 Java 套接字吗?
【发布时间】:2010-11-17 15:08:12
【问题描述】:

当一个程序通过 FastCGI 启动时,它会在一个已打开的套接字与 Web 服务器对话的情况下执行。套接字的文件描述符编号是交给程序的,但是如何将其转换为 Java 中有用的东西,例如 Socket 实例?

我的托管服务使用 Apache httpd 的 mod_fastcgi。他们不允许我配置一个外部服务器,我提供一个主机:端口以通过 FastCgiExternalServer 将请求转发到。

【问题讨论】:

    标签: java apache fastcgi mod-fastcgi


    【解决方案1】:

    你不能合法地这样做。然而,你可以做一个这样的黑客(不要在家里尝试这个)。您可以从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);
    

    【讨论】:

    • 我需要花一点时间才能将它连接到 FCGI 开发工具包的消息解析库,但这看起来像是要走的路。谢谢。
    【解决方案2】:

    您想要Socket 做什么?套接字中唯一有用的方法是getInputStreamgetOutputStream,但如果您作为CGI 运行,您已经拥有这些方法:它们被称为System.inSystem.out。 :)

    【讨论】:

    • 因为这不是 FastCGI 的工作方式,OP 知道这一点,这就是他提出这个问题的原因。
    • 我能找到的任何文档都告诉我,与System.inSystem.out 进行了通信,所以我原来的问题仍然存在。
    • (我说的是fastcgi.com/devkit/doc/fcgi-java.htm 的文档,对我来说这看起来很“官方”。)
    • @Bombe - 好主意,但这依赖于将 Java 程序作为“外部主机”启动并通过我的托管服务提供商不支持的 host:port 进行连接。
    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2019-04-17
    • 2011-12-08
    相关资源
    最近更新 更多