2

Android アプリケーションを mysql データベースに接続しようとしています。データベース「tardy_system」は、wamp サーバーが提供する phpmyadmin 内で実行されています。C:/Wamp/www/Latepass に、API バックエンドとして機能する php ファイル「login.php」があります。その主な目的は、データベースに接続してクエリを実行し、解析された JSON データとして機能することです。Android 環境内の Java コードは、index.php コードに接続することが想定されています。Java コードを php API バックエンドに接続できません。Java コードは、 http://192.168.0.102:3306/Latepass/ login.phpを参照するように指定しています。ファイルのために。この LAN アドレスは、wamp サーバーとデータベースの現在の内部アドレスです。現時点では動的ですが、最終的には静的 IP に変更します。Android APKを保存してエクスポートして実行した後、「学生ログイン」ボタンをクリックすると、Javaコードが開始されますが、

接続は常に失敗します。

PHP コードは機能し、LAN 上のどのコンピューターからでもアクセスできます。テスト クエリ (FOR DEBUGGINGONLY で始まるすべて) を実行したところ、LAN 上のどこからでも 2 つのブラウザー (Chrome と Firefox) で読み取ることができました。

ネットワーク経由でphpファイルに接続できるため、WAMPサーバーは機能しています。ブラウザ内でテスト クエリを実行するため、PHP ファイルは機能しています。

問題: 何かが Java コードと php コードの間の接続を妨げていると思います。すべてのファイアウォール (ルーターのハードウェアと Windows のソフトウェア) を無効にしようとしました。JSON 接続はポート 3306 を使用します。そのポートをフィルタリングするものはないようです。

私のphpコード - Latepass/login.php

<?php
//turn off error reporting
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);

//connect to mySQL
$connect = mysql_connect("localhost", "root", "") or die(mysql_error("connection error 2"));

//Select the database
mysql_select_db("tardy_system")or die("database selection error");


//Retrieve the login details via POST
$username = $_POST['username'];
$password = $_POST['password'];

//Query the table android login
$query = mysql_query("SELECT * FROM students WHERE username='$username' AND password='$password'");

//check if there any results returned
$num = mysql_num_rows($query);

//If a record was found matching the details entered in the query
if($num == 1){
    //Create a while loop that places the returned data into an array
    while($list=mysql_fetch_assoc($query)){
        //Store the returned data into a variable
        $output = $list;

        //encode the returned data in JSON format
        echo json_encode($output);

    }
    //close the connection
    mysql_close();  
}

?>

学生ログインアクティビティ

package com.android.upgrayeddapps.latepass;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class StudentLoginActivity extends Activity implements OnClickListener{
    EditText etUsername;
    EditText etPassword;
    Button btnLogin;

    //Create string variables that will have the input assigned to them
    String strUsername;
    String strPassword;

    //Create a HTTPClient as the form container
    HttpClient httpclient;

    //Use HTTP POST method
    HttpPost httppost;

    //Create an array list for the input data to be sent
    ArrayList<NameValuePair> nameValuePairs;

    //Create a HTTP Response and HTTP Entity
    HttpResponse response;
    HttpEntity entity;


    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.studentlogin);

        initialise();
    } 

    private void initialise()
    {

        etUsername = (EditText) findViewById(R.id.txtbxStudentUsername);
        etPassword = (EditText) findViewById(R.id.txtbxStudentLunchID);
        btnLogin = (Button) findViewById(R.id.btnLoginStudent);
        //Set onClickListener
        btnLogin.setOnClickListener(this);
    }

    public void onClick(View v) {

        //Create new default HTTPClient
        httpclient = new DefaultHttpClient();

        //Crate new HTTP POST with URL to php file as parameter
        httppost = new HttpPost("http://192.168.0.102:3306/Latepass/login.php");        


        //Assign input text to strings
        strUsername = etUsername.getText().toString();
        strPassword = etPassword.getText().toString();


        try{

            //Create an Array List
            nameValuePairs = new ArrayList<NameValuePair>();

            //place them in an array list
            nameValuePairs.add(new BasicNameValuePair("username", strUsername));
            nameValuePairs.add(new BasicNameValuePair("password", strPassword));


            //Add array list to http post
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            //assign executed for container to response
            response = httpclient.execute(httppost);

            //check status code, need to check status code 200
            if(response.getStatusLine().getStatusCode()== 200){
                    //assign response.getEntity()l

                    //check if entity is not null
                    if(entity !=null){
                            //create new input stream with received data assigned
                            InputStream instream = entity.getContent();

            //Create a JSON Object. Assign converted data as parameter
            JSONObject jsonResponse = new JSONObject(convertStreamToString(instream));

            //Assign JSON  responses to local strings
            String retUser = jsonResponse.getString("username");//mySQL table field
            String retPass = jsonResponse.getString("password");//mySQL table field


            //Validate login
            if(strUsername.equals(retUser)&& strPassword.equals(retPass)){

                //Create a new shared preference by getting the preference
                SharedPreferences sp = getSharedPreferences("logindetails",0);


                //Edit the shared Preferences
                SharedPreferences.Editor spedit = sp.edit();

                //Put the login details as strings
                spedit.putString("username", strUsername);
                spedit.putString("password", strPassword);

                //Close the editor
                spedit.commit();

                //Display a Toast saying login was a success
                Toast.makeText(getBaseContext(), "Success!",Toast.LENGTH_SHORT).show();


            } else{
                //Display a Toast saying it failed
                Toast.makeText(getBaseContext(), "Invalid Login Details", Toast.LENGTH_SHORT).show();
                    }
                }   

            }       

        } catch(Exception e){
            e.printStackTrace();
            //Display Toast when there is a connection error
            Toast.makeText(getBaseContext(), "Connection Error Android",Toast.LENGTH_SHORT).show();
            Log.e("YourTag", e.getMessage(), e);
        }
    }//End try/Catch


    private static String convertStreamToString(InputStream is) {
        /*
         * To convert the InputStream to String we use the BufferedReader.readLine()
         * method. We iterate until the BufferedReader return null which means
         * there's no more data to read. Each line will appended to a StringBuilder
         * and returned as String.
         */
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }//End ConvertStreamToString()

    public void onGotoLatePassActiviy(View View)
    {
        Intent intent = new Intent(View.getContext(), LatePassActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        StudentLoginActivity.this.finish();
    }

}

質問: wamp の設定で、Java コードが php コードに到達できない何かが欠けていますか?

現在、いくつかのApacheエラーが発生しているため、構成を試みる必要があります。

今日: ログイン プロセス中にwiresharkを実行しました。tcp 送信元と送信先 = 3306 フィルターを適用しました。この送信を取得しました

4

1 に答える 1

2

WAMP サーバーは、ポート 80 とポート 3306 の 2 つのポートでリッスンします。ポート 80 は Web サーバー用で、ポート 3306 はデータベース サーバー用です。

ポート 3306 を介して Web サーバー (および PHP) に接続することはできません。データベース サーバーにアクセスすると、クライアントが別のプロトコルを使用していることを認識すると、すぐに接続が切断されます。

私のローカル マシンでの例:

$ curl http://localhost:3306/
5.1.49-1ubuntu8.1+Yt^Y#CeV�]Sd"tIM(|[1"�Got packets out of order$ 

解決策は、URL をhttp://192.168.0.102/Latepass/login.phpに変更することです。

これが機能しない場合は、Web サーバーがリッスンしていることを確認します。コマンド プロンプトで と入力しますnetstat -a -n -p tcp。次のように表示されます。

Proto  Local Address          Foreign Address        State
TCP    0.0.0.0:80             0.0.0.0:0              LISTENING
TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
... etc...

最初の行が :80 で終わっていない場合は、apache がリッスンしていないか、ポートを変更した可能性があります。詳細については、Apache のログを参照してください。

于 2012-04-23T12:53:07.057 に答える