java - webview 没有命中服务器套接字代理

标签 java android sockets webview serversocket

我已经使用下面的这段代码设置了我的 webview 的代理:

ProxySettings.setProxy(mContext, "http://127.0.0.1", PORT);

这是我的套接字服务器监听器

serverSocket = new ServerSocket(PORT);
thread = new Thread(runnable, this.getClass().getSimpleName());


public void startlistener() {
        listening = true;
        thread.start();

    }

private Runnable runnable = new Runnable() {

        @Override
        public void run() {
            while (listening) {
                try {
                    Socket accept = serverSocket.accept();

                    String data = getData(accept);

                    httpHandler.handleRequest(data);

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }
    };

我在 String data = getData(accept); 上设置了一个断点;而且它永远不会击中它

下面是取自https://gist.github.com/madeye/2297083的代理类

public class ProxySettings {

    private static final String TAG = "GAEProxy.ProxySettings";

    static final int PROXY_CHANGED = 193;

    private static Object getDeclaredField(Object obj, String name)
            throws SecurityException, NoSuchFieldException,
            IllegalArgumentException, IllegalAccessException {
        Field f = obj.getClass().getDeclaredField(name);
        f.setAccessible(true);
        Object out = f.get(obj);
        // System.out.println(obj.getClass().getName() + "." + name + " = "+
        // out);
        return out;
    }

    public static Object getRequestQueue(Context ctx) throws Exception {
        Object ret = null;
        Class networkClass = Class.forName("android.webkit.Network");
        if (networkClass != null) {
            Object networkObj = invokeMethod(networkClass, "getInstance",
                    new Object[] { ctx }, Context.class);
            if (networkObj != null) {
                ret = getDeclaredField(networkObj, "mRequestQueue");
            }
        }
        return ret;
    }

    private static Object invokeMethod(Object object, String methodName,
            Object[] params, Class... types) throws Exception {
        Object out = null;
        Class c = object instanceof Class ? (Class) object : object.getClass();
        if (types != null) {
            Method method = c.getMethod(methodName, types);
            out = method.invoke(object, params);
        } else {
            Method method = c.getMethod(methodName);
            out = method.invoke(object);
        }
        // System.out.println(object.getClass().getName() + "." + methodName +
        // "() = "+ out);
        return out;
    }

    public static void resetProxy(Context ctx) throws Exception {
        Object requestQueueObject = getRequestQueue(ctx);
        if (requestQueueObject != null) {
            setDeclaredField(requestQueueObject, "mProxyHost", null);
        }
    }

    private static void setDeclaredField(Object obj, String name, Object value)
            throws SecurityException, NoSuchFieldException,
            IllegalArgumentException, IllegalAccessException {
        Field f = obj.getClass().getDeclaredField(name);
        f.setAccessible(true);
        f.set(obj, value);
    }

    /**
     * Override WebKit Proxy settings
     * 
     * @param ctx
     *            Android ApplicationContext
     * @param host
     * @param port
     * @return true if Proxy was successfully set
     */
    public static boolean setProxy(Context ctx, String host, int port) {
        boolean ret = false;
        setSystemProperties(host, port);

        try {
            if (Build.VERSION.SDK_INT < 14) {

                Object requestQueueObject = getRequestQueue(ctx);
                if (requestQueueObject != null) {
                    // Create Proxy config object and set it into request Q
                    HttpHost httpHost = new HttpHost(host, port, "http");

                    setDeclaredField(requestQueueObject, "mProxyHost", httpHost);
                    ret = true;
                }

            } else {
                ret = setICSProxy(host, port);
            }
        } catch (Exception e) {
            Log.e(TAG, "error setting up webkit proxying", e);
        }
        return ret;
    }

    private static boolean setICSProxy(String host, int port)
            throws ClassNotFoundException, NoSuchMethodException,
            IllegalArgumentException, InstantiationException,
            IllegalAccessException, InvocationTargetException {
        Class webViewCoreClass = Class.forName("android.webkit.WebViewCore");
        Class proxyPropertiesClass = Class
                .forName("android.net.ProxyProperties");
        if (webViewCoreClass != null && proxyPropertiesClass != null) {
            Method m = webViewCoreClass.getDeclaredMethod("sendStaticMessage",
                    Integer.TYPE, Object.class);
            Constructor c = proxyPropertiesClass.getConstructor(String.class,
                    Integer.TYPE, String.class);
            m.setAccessible(true);
            c.setAccessible(true);
            Object properties = c.newInstance(host, port, null);
            m.invoke(null, PROXY_CHANGED, properties);
            return true;
        }
        return false;

    }

    private static void setSystemProperties(String host, int port) {

        System.setProperty("http.proxyHost", host);
        System.setProperty("http.proxyPort", port + "");

        System.setProperty("https.proxyHost", host);
        System.setProperty("https.proxyPort", port + "");

    }
}

我错过了什么吗?

ServerSocket 在运行 webview 的同一个 android 应用程序中运行,其想法是重定向所有 http 请求以通过我的套接字服务器代理。

谢谢

编辑:我调试了代理代码,它失败并抛出这个异常

07-01 15:44:02.894: E/GAEProxy.ProxySettings(11267): error setting up webkit proxying = java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

它发生在我调用 setProxy 时。

有什么建议吗?

最佳答案

关于java - webview 没有命中服务器套接字代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17369055/

相关文章:

java - Android Studio 和 Gradle : Add outside java classes to Android main project

java - 应该使用哪个类在 java 中创建 TLS 连接。套接字类或 SSLSocket 类?

c - 唯一标识套接字

c# - 通过 .Net Socket 发送/接收为串行通信构建的消息

java - Spring Boot permitAll 在 WebSecurityConfigurerAdapter 中不起作用

java - 如何从 Amazon S3 读取大文件?

java - 当我要求它在 toast 中显示保存的数据时,我的应用程序崩溃了 - 我

java - 如何使用默认 servlet 处理程序

java - 使用 GSON 解析 JSON 内部字段

android - 我无法从 android 中的位置管理器获取位置