0

私は Java および Android プログラミングが初めてで、サーバー上の PHP ファイルの結果を取得しようとしていますが、次の例外が発生します。

java.net.ProtocolException: Unexpected status line: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at com.android.okhttp.internal.http.StatusLine.parse(StatusLine.java:54)
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191)
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80)
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:905)
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:789)
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:443)
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:388)
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231)
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at it.codesnippet.dots.LoginActivity$1$override.run(LoginActivity.java:49)
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at it.codesnippet.dots.LoginActivity$1$override.access$dispatch(LoginActivity.java)
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at it.codesnippet.dots.LoginActivity$1.run(LoginActivity.java:0)
07-10 11:18:54.112 24683-25081/it.codesnippet.dots W/System.err:     at java.lang.Thread.run(Thread.java:818)

これは、例外が発生するコード ( LoginActivity.java内) です。

Thread loginCheckThread = new Thread(new Runnable() {
    public void run() {
        String result = "", dataObj = "";
        TextView username = (TextView) findViewById(R.id.login_mail);
        TextView password = (TextView) findViewById(R.id.login_password);

        JSONObject jsonObj = new JSONObject();
        try {
            jsonObj.put("loginMail", username.getText());
            jsonObj.put("loginPassword", password.getText());
            dataObj = jsonObj.toString(0);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        try {
            URL url = new URL("http://myserver.it/testandroid.php?data=" + dataObj);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

            try {
/* line #49 */  InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                ByteArrayOutputStream bo = new ByteArrayOutputStream();
                int i = in.read();
                while (i != -1) {
                    bo.write(i);
                    i = in.read();
                }
                result = bo.toString();
            } catch (IOException e) {
                result = "Exception: Class::IOStream Related";
                e.printStackTrace();

            } finally {
                urlConnection.disconnect();
            }
        } catch (IOException e) {
            result = "Exception: Class::URL Related";
        }

        System.out.println(result);
    }
});
loginCheckThread.start();

例外を引き起こす行は行番号 49です。

InputStream in = new BufferedInputStream(urlConnection.getInputStream());

PHP ファイルは今のところ単なるテスト ファイルであり、クエリ文字列<input_username> - <input_password>の変数から取得された値を返すことになっています。data

$jsonObj = json_decode($_GET["data"], TRUE);

echo $jsonObj["loginMail"] . " - " . $jsonObj["loginPassword"];

この問題でブロックされてから約 2 日経ちましたが、これを解決するにはどうすればよいですか?

4

2 に答える 2

0

私はまだコメントを残すことを許可されていないので、回答を書く必要があります。HTTP と HTML には違いがあります。HTTP は、データ (HTML など) のダウンロードに使用されます。PHP スクリプトはダウンロード可能なコンテンツを生成しますが、HTTP クライアントはそれが既にコンテンツであると認識していないようです。例として、HTTP 応答が通常どのように見えるかを示したいと思います。

HTTP/1.1 200 OK
Date: Sun, 10 Jul 2016 10:02:42 GMT
Content-Type: text/html
Content-Length: 6920
Last-Modified: Sun, 10 Jul 2016 04:00:22 GMT
Connection: keep-alive
Accept-Ranges: bytes

Here goes the content.

ご覧のとおり、2 つの改行または CRLF (キャリッジ リターン、ライン フィード) が表示されるまで、HTTP 情報が表示されます。LF のみでそれを実装しているサーバーを見たことがありますが、それが問題である可能性があります。これは、Java クライアントがコンテンツの開始時刻を認識できないためです。テストを行いましょう: PHP ファイルの先頭に権利を追加してecho "\r\n\r\n";、CRLFCRLF を手動で出力します。それが機能する場合、サーバー ソフトウェアの出力が間違っています。スクリプトでもクライアントでもありません。ただし、RFC 2616 では、CR を無視して LF のみを監視することをお勧めします。

メッセージ ヘッダー フィールドの行終端文字は、シーケンス CRLF です。ただし、アプリケーションがそのようなヘッダーを解析するときは、単一​​の LF を行末記号として認識し、先頭の CR を無視することをお勧めします。 RFC2616

于 2016-07-10T10:12:06.090 に答える