首页 > 解决方案 > 无法打开流:使用 phpjavabridge 的 HTTP 请求失败

问题描述

我在使用 php java bridge 时遇到问题,出现这样的错误

Warning: require_once(http://localhost:8080/JavaBridge/java/Java.inc): failed to open stream: HTTP request failed! in /Library/WebServer/Documents/test2.php on line 3

Fatal error: require_once(): Failed opening required 'http://localhost:8080/JavaBridge/java/Java.inc' (include_path='.:') in /Library/WebServer/Documents/test2.php on line 3

我的 tomcat 已在 8080 端口运行。我强制使用 8080 端口,但仍然出现错误

这是我的 Java 桥的独立类

package php.java.bridge;

import php.java.bridge.util.Thread;
import java.lang.reflect.Method;
import php.java.bridge.http.JavaBridgeRunner;
import php.java.bridge.util.Logger;
import java.io.File;
import javax.swing.Icon;
import java.awt.Component;
import javax.swing.JOptionPane;
import java.net.ServerSocket;
import java.io.IOException;
import php.java.bridge.http.TCPServerSocket;
import php.java.bridge.http.ISocketFactory;

public class Standalone
{
    public static final int HTTP_PORT_BASE = 8080;
    public static final int HTTPS_PORT_BASE = 8443;
    
    public static ISocketFactory bind(final int logLevel, final String sockname) throws IOException {
        ISocketFactory socket = null;
        socket = TCPServerSocket.create(sockname, 20);
        if (null == socket) {
            throw new IOException("Could not create socket: " + sockname);
        }
        return socket;
    }
    
    protected static void disclaimer() {
        System.err.println("Copyright (C) 2003, 2006 Jost Boekemeier and others.");
        System.err.println("This is free software; see the source for copying conditions.  There is NO");
        System.err.println("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.");
    }
    
    protected void javaUsage() {
        System.err.println("PHP/Java Bridge version " + Util.VERSION);
        disclaimer();
        System.err.println("Usage: java -jar JavaBridge.jar [SOCKETNAME LOGLEVEL LOGFILE]");
        System.err.println("SOCKETNAME is one of INET_LOCAL, INET, HTTP_LOCAL, HTTP, HTTPS_LOCAL, HTTPS");
        System.err.println("");
        System.err.println("Example 1: java -jar JavaBridge.jar");
        System.err.println("Example 2: java -jar JavaBridge.jar HTTP_LOCAL:8080 3 JavaBridge.log");
        System.err.println("Example 3: java -Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=YOURPASSWD -jar JavaBridge.jar HTTPS:8443 3 JavaBridge.log");
        System.err.println("The certificate for example 3 can be created with e.g.: jdk1.6.0/bin/keytool -keystore mySrvKeystore -genkey -keyalg RSA");
        System.err.println("");
        System.err.println("Influential system properties: threads, daemon, php_exec, default_log_file, default_log_level, base.");
        System.err.println("Example: java -Djava.awt.headless=\"true\" -Dphp.java.bridge.threads=50 -Dphp.java.bridge.base=/usr/lib/php/modules -Dphp.java.bridge.php_exec=/usr/local/bin/php-cgi -Dphp.java.bridge.default_log_file= -Dphp.java.bridge.default_log_level=5 -jar JavaBridge.jar");
        System.err.println("Example: java -Dphp.java.bridge.daemon=\"true\" -jar JavaBridge.jar");
    }
    
    protected void usage() {
        this.javaUsage();
        System.exit(1);
    }
    
    protected void checkOption(final String[] s) {
        if ("--version".equals(s[0])) {
            System.out.println(Util.VERSION);
            System.exit(0);
        }
        this.usage();
    }
    
    private static boolean testPort(final int port) {
        try {
            final ServerSocket sock = new ServerSocket(port);
            sock.close();
            return true;
        }
        catch (IOException ex) {
            return false;
        }
    }
    
    private static int findFreePort(final int start) {
        for (int port = start; port < start + 100; ++port) {
            if (testPort(port)) {
                return port;
            }
        }
        return start;
    }
    
    public void init(final String[] s) {
        String sockname = null;
        int logLevel = -1;
       // final String tcpSocketName = "9267";
        final String tcpSocketName = "8080";
        if (s.length > 3) {
            this.checkOption(s);
        }
        try {
            if (s.length > 0) {
                sockname = s[0];
                if (sockname.startsWith("-")) {
                    this.checkOption(s);
                }
            }
            try {
                if (s.length > 1) {
                    logLevel = Integer.parseInt(s[1]);
                }
            }
            catch (NumberFormatException e2) {
                this.usage();
            }
            catch (Throwable t) {
                t.printStackTrace();
            }
            if (s.length == 0) {
                try {
                 /*   final int tcpSocket = Integer.parseInt(tcpSocketName);
                    final int freeJavaPort = findFreePort(tcpSocket);
                    final int freeHttpPort = findFreePort(8080);
                    final int freeHttpsPort = findFreePort(8443);
                    final Object result = JOptionPane.showInputDialog(null, "Start a socket listener on port", "Starting the PHP/Java Bridge ...", 3, null, new String[] { "INET_LOCAL:" + freeJavaPort, "INET:" + freeJavaPort, "HTTP_LOCAL:" + freeHttpPort, "HTTP:" + freeHttpPort, "HTTPS_LOCAL:" + freeHttpsPort, "HTTPS:" + freeHttpsPort }, "HTTP_LOCAL:" + freeHttpPort);
                        //final Object result = 8080;
                    if (result == null) {
                        System.exit(0);
                    }*/
                    //sockname = result.toString();
                    sockname = "8080";
                }
                catch (Throwable t2) {}
            }
            if (s.length == 0) {
                TCPServerSocket.TCP_PORT_BASE = Integer.parseInt(tcpSocketName);
            }
            if (checkServlet(logLevel, sockname, s)) {
                return;
            }
            final ISocketFactory socket = bind(logLevel, sockname);
            if ("true".equals(System.getProperty("php.java.bridge.test.startup"))) {
                System.exit(0);
            }
            JavaBridge.initLog(String.valueOf(socket), logLevel, s);
            JavaBridge.init(socket, logLevel, s);
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    
    public static File getCanonicalWindowsFile(final String path) {
        try {
            return new File(path).getCanonicalFile();
        }
        catch (IOException e) {
            return new File(path);
        }
    }
    
    private static boolean checkServlet(final int logLevel, String sockname, final String[] s) throws InterruptedException, IOException {
        if (sockname == null) {
            return false;
        }
        if (sockname.startsWith("SERVLET_LOCAL:") || sockname.startsWith("HTTP_LOCAL:") || sockname.startsWith("HTTPS_LOCAL:")) {
            Util.JAVABRIDGE_PROMISCUOUS = false;
            System.setProperty("php.java.bridge.promiscuous", "false");
        }
        else {
            if (!sockname.startsWith("SERVLET:") && !sockname.startsWith("HTTP:") && !sockname.startsWith("HTTPS:")) {
                return false;
            }
            Util.JAVABRIDGE_PROMISCUOUS = true;
            System.setProperty("php.java.bridge.promiscuous", "true");
        }
        final boolean isSecure = sockname.startsWith("HTTPS");
        JavaBridge.initLog(sockname, logLevel, s);
        sockname = sockname.substring(sockname.indexOf(58) + 1);
        final String serverPort = (Util.JAVABRIDGE_PROMISCUOUS ? "INET:" : "INET_LOCAL:") + sockname;
        Logger.logMessage("JavaBridgeRunner started on port " + serverPort);
        Class runner = JavaBridgeRunner.class;
        JavaBridgeRunner r;
        try {
            runner = Util.classForName("php.java.script.JavaBridgeScriptRunner");
            final Method m = runner.getMethod("getRequiredInstance", String.class, Boolean.TYPE);
            r = (JavaBridgeRunner)m.invoke(runner, serverPort, new Boolean(isSecure));
        }
        catch (Throwable e) {
            r = JavaBridgeRunner.getRequiredInstance(serverPort, isSecure);
        }
        r.waitFor();
        r.destroy();
        return true;
    }
    
    private static final boolean checkGNUVM() {
        try {
            return "libgcj".equals(System.getProperty("gnu.classpath.vm.shortname"));
        }
        catch (Throwable t) {
            return false;
        }
    }
    
    public static void main(final String[] s) {
        if (!System.getProperty("php.java.bridge.daemon", "false").equals("false")) {
            final String[] args = new String[s.length + 8];
            args[0] = System.getProperty("php.java.bridge.daemon");
            if ("true".equals(args[0])) {
                args[0] = "java";
            }
            args[1] = "-Djava.library.path=" + System.getProperty("java.library.path", ".");
            args[2] = "-Djava.ext.dirs=" + System.getProperty("java.ext.dirs", ".");
            args[3] = "-Djava.awt.headless=" + System.getProperty("java.awt.headless", "true");
            args[4] = "-Dphp.java.bridge.asDaemon=true";
            args[5] = "-classpath";
            args[6] = System.getProperty("java.class.path", ".");
            args[7] = "php.java.bridge.Standalone";
            for (int j = 0; j < s.length; ++j) {
                args[j + 8] = s[j];
            }
            try {
                System.in.close();
                System.out.close();
                System.err.close();
            }
            catch (IOException e) {
                System.exit(12);
            }
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Runtime.getRuntime().exec(args);
                    }
                    catch (IOException e) {
                        System.exit(13);
                    }
                }
            }).start();
            try {
                java.lang.Thread.sleep(20000L);
            }
            catch (Throwable t2) {}
            System.exit(0);
        }
        try {
            System.loadLibrary("natcJavaBridge");
        }
        catch (Throwable t3) {}
        try {
            final String cp = System.getProperty("java.class.path", ".");
            File jbFile = null;
            final boolean isExecutableJavaBridgeJar = cp.indexOf(File.pathSeparatorChar) == -1 && cp.endsWith("JavaBridge.jar") && (jbFile = new File(cp)).isAbsolute();
            final File wd = getCanonicalWindowsFile(isExecutableJavaBridgeJar ? jbFile.getParent() : "");
            final boolean sunJavaInstalled = new File("/usr/java/default/bin/java").exists();
            final String javaExec = sunJavaInstalled ? "/usr/java/default/bin/java" : "java";
            if (s.length == 0 && System.getProperty("php.java.bridge.exec_sun_vm", "true").equals("true") && ((sunJavaInstalled && checkGNUVM()) || isExecutableJavaBridgeJar)) {
                final Process p = Runtime.getRuntime().exec(new String[] { javaExec, "-Dphp.java.bridge.exec_sun_vm=false", "-classpath", cp, "php.java.bridge.Standalone" }, null, wd);
                if (p != null) {
                    System.exit(p.waitFor());
                }
            }
        }
        catch (Throwable t4) {}
        try {
            new Standalone().init(s);
        }
        catch (Throwable t) {
            t.printStackTrace();
            System.exit(9);
        }
    }
}

在此源代码中,我使用此代码强制手动选择 8080

/*   final int tcpSocket = Integer.parseInt(tcpSocketName);
                    final int freeJavaPort = findFreePort(tcpSocket);
                    final int freeHttpPort = findFreePort(8080);
                    final int freeHttpsPort = findFreePort(8443);
                    final Object result = JOptionPane.showInputDialog(null, "Start a socket listener on port", "Starting the PHP/Java Bridge ...", 3, null, new String[] { "INET_LOCAL:" + freeJavaPort, "INET:" + freeJavaPort, "HTTP_LOCAL:" + freeHttpPort, "HTTP:" + freeHttpPort, "HTTPS_LOCAL:" + freeHttpsPort, "HTTPS:" + freeHttpsPort }, "HTTP_LOCAL:" + freeHttpPort);
                        //final Object result = 8080;
                    if (result == null) {
                        System.exit(0);
                    }*/
                    //sockname = result.toString();
                    sockname = "8080";
                }

在 tcpServer 我强制选择该端口使用此代码

import java.net.Socket;
import java.net.UnknownHostException;
import java.net.InetAddress;
import java.io.IOException;
import java.net.ServerSocket;

public class TCPServerSocket implements ISocketFactory
{
    public static int TCP_PORT_BASE;
    private ServerSocket sock;
    private int port;
    boolean local;
    
    public static ISocketFactory create(String name, final int backlog) throws IOException {
        boolean local = false;
        if (name == null) {
            throw new NullPointerException("name");
        }
        if (name.startsWith("INET:")) {
            name = name.substring(5);
        }
        else if (name.startsWith("INET_LOCAL:")) {
            local = true;
            name = name.substring(11);
        }
        final int p = Integer.parseInt(name);
        final TCPServerSocket s = new TCPServerSocket(p, backlog, local);
        return s;
    }
    
    private ServerSocket newServerSocket(final int port, final int backlog) throws IOException {
        try {
            if (this.local) {
                return new ServerSocket(port, backlog, InetAddress.getByName("127.0.0.1"));
            }
        }
        catch (UnknownHostException ex) {}
        return new ServerSocket(port, backlog);
    }
    
    private void findFreePort(final int start, final int backlog) {
        int port = start;
        while (port < start + 100) {
            try {
                this.sock = this.newServerSocket(port, backlog);
                this.port = port;
                return;
            }
            catch (IOException e) {
                ++port;
                continue;
            }
        }
    }
    
    private TCPServerSocket(final int port, final int backlog, final boolean local) throws IOException {
        this.local = local;
        if (port == 0) {
            this.findFreePort(TCPServerSocket.TCP_PORT_BASE, backlog);
        }
        else {
            this.sock = this.newServerSocket(port, backlog);
            this.port = port;
        }
    }
    
    @Override
    public void close() throws IOException {
        this.sock.close();
    }
    
    @Override
    public Socket accept() throws IOException {
        final Socket s = this.sock.accept();
        s.setTcpNoDelay(true);
        return s;
    }
    
    @Override
    public String getSocketName() {
        return String.valueOf(this.port);
    }
    
    @Override
    public String toString() {
        return (this.local ? "INET_LOCAL:" : "INET:") + this.getSocketName();
    }
    
    static {
     //   TCPServerSocket.TCP_PORT_BASE = 9267;
        TCPServerSocket.TCP_PORT_BASE = 8080;
    }
}

但是我的 javabridge 无法在该端口打开流,为什么这样?任何想法只选择端口 8080 不选择其他?

标签: javaphp-java-bridge

解决方案


我更改此代码后此问题关闭

try { /*
                  final int tcpSocket = Integer.parseInt(tcpSocketName);
                    final int freeJavaPort = findFreePort(tcpSocket);
                    final int freeHttpPort = findFreePort(8080);
                    final int freeHttpsPort = findFreePort(8443);
                    final Object result = JOptionPane.showInputDialog(null, "Start a socket listener on port", "Starting the PHP/Java Bridge ...", 3, null, new String[] { "INET_LOCAL:" + freeJavaPort, "INET:" + freeJavaPort, "HTTP_LOCAL:" + freeHttpPort, "HTTP:" + freeHttpPort, "HTTPS_LOCAL:" + freeHttpsPort, "HTTPS:" + freeHttpsPort }, "HTTP_LOCAL:" + freeHttpPort);
                        //final Object result = 8080;
                    if (result == null) {
                        System.exit(0);
                    }*/
                    //sockname = result.toString();
                    
                    sockname = "HTTP_LOCAL:8080";
                    System.out.println("sockname"+sockname);
                }

所以 sockname 使用“HTTP_LOCAL:8080”而不是“8080”


推荐阅读