0

HTTP プロキシか Socks プロキシかをテストするプロキシのリストがありますが、以下の Java コードは、connection.getContent() または connection.getInputStream() を呼び出すとハングします。この問題は、プロキシ サーバーが応答せず、コードがサーバーからの応答を待機しているときにブロックされることがわかりました。サーバーが応答しないときに、このコードが永久にハング/ブロックするのを防ぐにはどうすればよいですか。次のプロキシをチェックできます。

import java.io.*;
import java.net.*;
import java.util.*;

public class ProxyTest {

    public static void main(String[] args) throws IOException {

        InetSocketAddress proxyAddress = new InetSocketAddress("myproxyaddress", 1234);

        Proxy.Type proxyType = detectProxyType(proxyAddress);
    }

    public static Proxy.Type detectProxyType(InetSocketAddress proxyAddress) throws IOException {

    URL url = new URL("http://www.google.com/");

    List<Proxy.Type> proxyTypesToTry = Arrays.asList(Proxy.Type.SOCKS, Proxy.Type.HTTP);

    for(Proxy.Type proxyType : proxyTypesToTry) {

        Proxy proxy = new Proxy(proxyType, proxyAddress);

        URLConnection connection = null;

        try {

            connection = url.openConnection(proxy);

            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);

            connection.getContent();
            //connection.getInputStream();

            return(proxyType);
        }

        catch (SocketException e) {

    e.printStackTrace();
        }
    }

    return(null);
}
}
4

2 に答える 2

1

並行して処理するには、スレッドを使用します。

for(Foo f : foos){
    Thread t = new Thread(new Runnable(){
        @Override
        public void run(){
            // blocking call
        }        
    });
    t.start();
}

java.util.concurrentさらに良いのは、パッケージ内のデータ構造の 1 つを利用することです。

于 2012-07-20T19:56:34.977 に答える
0

これには単純で単純な解決策はないと思います。答えは、JDK のバージョン、実装、および実行環境によって異なります。詳細については、Java URLConnection Timeoutを参照してください。

于 2012-07-20T20:03:22.667 に答える