1

つまり、一言で言えば、私は、Http 通信について一種の学習を行うために使用できる小さな動作するスケルトン プログラムを取得しようとしているだけであり、私が取り組んでいるより大きなプログラムに最終的に何が必要になるかを理解するために自分のやり方を「感じる」ことができます。の上。ここにあるこの特定のコードは、実際には Apache ライブラリの例を切り刻んだバージョンです。Apache Web サイトにリストされている例をコンパイルできましたが、正しく実行されず、「java.net.ConnectException」が発生しました。私は、このようなプログラムが接続を確立するのを Windows が c-block することに関係していて、管理者として実行する必要があると考えました。次に、コードを取得して実行可能な jar ファイルにスローしようとしましたが、Cannot-find-or-load-main-class エラーが発生します。私はばかですか、それとも Apache ライブラリが少し古くなっている/Win 8 に適していない/何か他のものですか?

以下のコード:

package NewProject;


import java.net.Socket;

import org.apache.http.ConnectionReuseStrategy;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.impl.DefaultBHttpClientConnection;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.message.BasicHttpRequest;
import org.apache.http.protocol.HttpCoreContext;
import org.apache.http.protocol.HttpProcessor;
import org.apache.http.protocol.HttpProcessorBuilder;
import org.apache.http.protocol.HttpRequestExecutor;
import org.apache.http.protocol.RequestConnControl;
import org.apache.http.protocol.RequestContent;
import org.apache.http.protocol.RequestExpectContinue;
import org.apache.http.protocol.RequestTargetHost;
import org.apache.http.protocol.RequestUserAgent;
import org.apache.http.util.EntityUtils;

class NewProject
{
    public static void main(String[] args) throws Exception
    {
        HttpProcessor httpproc = HttpProcessorBuilder.create()
            .add(new RequestContent())
            .add(new RequestTargetHost())
            .add(new RequestConnControl())
            .add(new RequestUserAgent("Test/1.1"))
            .add(new RequestExpectContinue(true)).build();

        HttpRequestExecutor httpexecutor = new HttpRequestExecutor();

        HttpCoreContext coreContext = HttpCoreContext.create();
        HttpHost host = new HttpHost("localhost", 8080);
        coreContext.setTargetHost(host);

        Out os = new Out("TestOut.txt");

        DefaultBHttpClientConnection conn = new DefaultBHttpClientConnection(8 * 1024);
        ConnectionReuseStrategy connStrategy = DefaultConnectionReuseStrategy.INSTANCE;

        try 
        {

            String[] targets = 
            {
                "http://www.google.com/"
            };

            for (int i = 0; i < targets.length; i++) 
            {
                if (!conn.isOpen()) 
                {
                    Socket socket = new Socket(host.getHostName(), host.getPort());
                    conn.bind(socket);
                }
                BasicHttpRequest request = new BasicHttpRequest("GET", targets[i]);
                os.println(">> Request URI: " + request.getRequestLine().getUri());

                httpexecutor.preProcess(request, httpproc, coreContext);
                HttpResponse response = httpexecutor.execute(request, conn, coreContext);
                httpexecutor.postProcess(response, httpproc, coreContext);

                os.println("<< Response: " + response.getStatusLine());
                os.println(EntityUtils.toString(response.getEntity()));
                os.println("==============");

                if (!connStrategy.keepAlive(response, coreContext)) 
                {
                    conn.close();
                }
                else 
                {
                    os.println("Connection kept alive...");
                }
            }
        }
        catch (IndexOutOfBoundsException iob)
        {
            os.println("What happened here?");
        }
        finally
        {
            conn.close();
        }

        return;
    }
}
4

2 に答える 2

1

...それらは正しく実行されず、「java.net.ConnectException」が発生しました

それは多くのことが原因である可能性があります。例外メッセージに手がかりがあります...あなたが私たちと共有しないことを選択しました.

...「メインクラスが見つからないか読み込めません」

ここでも複数の原因が考えられますが、例外メッセージに手がかりがあります...あなたが私たちと共有しないことを選択した.

しかし、JAR ファイルを作成したという事実と、提供したエラー メッセージ フラグメントの「メイン クラス」ヒントは、JAR ファイルの作成に誤りがあったことを示唆しています。つまり、「Main-Class」属性に間違った名前を使用しました。

そのソース コードを考えると、「Main-Class」属性は「NewProject.NewProject」である必要があります。別のものに設定した疑いがあります。

2 つ目の可能性は、Apache ライブラリへの依存関係を正しく処理していないことです。Apache クラスは、JAR ファイルで指定されたクラスパス上にある必要があります。-cp(引数を使用したり$CLASSPATH、 で起動した場合は使用できませんjava -jar。)


私はばかですか、それとも Apache ライブラリが少し古くなっている/Win 8 に適していない/何か他のものですか?

Apache ライブラリに問題はありません。

于 2015-06-08T04:07:15.297 に答える
0

あなたが投稿したコードは、少し低レベルのようです (例: ソケット接続との直接対話)。以下に投稿されたコードは、探しているように聞こえるものを提供するはずです。また、使用されるクラスは、http パラメーター (ヘッダー、タイムアウトなど) の設定と取得に多くの侵入をもたらします。

package org.yaorma.example.http.client;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpClientExample {

    public static void main(String[] args) throws Exception {
        String response;
        response = get("http://www.google.com");
        System.out.println("RESPONSE FROM GET -----------------------------------------");
        System.out.println(response);
        response = post("http://httpbin.org/post", "This is the message I posted to httpbin.org/post");
        System.out.println("RESPONSE FROM POST -----------------------------------------");
        System.out.println(response);
    }

    /**
     * Method to post a request to a given URL.
     */
    public static String post(String urlString, String message) {
        try {
            // get a connection
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // set the parameters
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            // send the message
            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
            writer.write(message);
            writer.flush();
            writer.close();
            os.close();
            // get the response
            conn.connect();
            InputStream content = (InputStream) conn.getInputStream();
            // read the response
            BufferedReader in = new BufferedReader(new InputStreamReader(content));
            String rtn = "";
            String line;
            while ((line = in.readLine()) != null) {
                rtn += line + "\n";
            }
            return rtn;
        } catch (Exception exp) {
            throw new RuntimeException(exp);
        }
    }

    /**
     * Method to do a get from a given URL.
     */
    public static String get(String urlString) {
        try {
            // get a connection
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // set the parameters
            conn.setRequestMethod("GET");
            conn.setDoOutput(true);
            // get the response
            conn.connect();
            InputStream content = (InputStream) conn.getInputStream();
            // read the response
            BufferedReader in = new BufferedReader(new InputStreamReader(content));
            String rtn = "";
            String line;
            while ((line = in.readLine()) != null) {
                rtn += line + "\n";
            }
            return rtn;
        } catch (Exception exp) {
            throw new RuntimeException(exp);
        }
    }

}
于 2015-06-08T04:26:04.057 に答える