2

我从未构建过任何可以与服务器通信的 Android 应用程序。我想要做的是我想将用户名和密码发送到服务器,在服务器上匹配它们,当用户名和密码匹配时,应该显示下一个屏幕。下一个屏幕应该只有一个文本视图,上面写着“欢迎用户名”。

我想让你们告诉我一步一步的指南-

  1. 我应该在Android App中写什么?
  2. 我应该在服务器端写什么?
  3. 如何以及在哪里编写服务器代码?
  4. 我应该在服务器端使用哪种语言?
  5. 如何在服务器上保存多个用户名密码?

我没有真正的服务器。我将在 localhost 上运行整个代码。

更新:

这是我在我的 Android 应用程序中写的。我不知道多少是正确的。

public void clicked(View v) {
    System.out.println("button clicked");
    EditText username = (EditText) findViewById(R.id.edituser);
    EditText password = (EditText) findViewById(R.id.editpass);

    Editable user = username.getText();
    Editable pass = password.getText();

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://192.168.1.101:8080//WebApplication1/sendresponse.java");

    try {
        // Add your data
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("username", user.toString()));
        nameValuePairs.add(new BasicNameValuePair("password", pass.toString()));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);

        Header[] headers = response.getAllHeaders();
        int len = headers.length;
        for(int i=0; i<len; i++) {
            System.out.println("header : " + headers[i]);
        }

        InputStream inputStream = response.getEntity().getContent();

        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        StringBuilder stringBuilder = new StringBuilder();

        String bufferedStrChunk = null;

        while((bufferedStrChunk = bufferedReader.readLine()) != null){
            stringBuilder.append(bufferedStrChunk);
        }
        System.out.println("response : " + stringBuilder.toString());

    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
    } catch (IOException e) {
        // TODO Auto-generated catch block
    }



}

我不知道哪种语言最适合服务器端。我应该在服务器端使用 REST 吗?

4

1 回答 1

8

我将使用 php 进行身份验证。首先,

 HttpPost httppost = new HttpPost("http://10.0.2.2/login.php");

10.0.2.2 从模拟器中引用 localhost。对于真实设备,您需要真实的服务器。

您必须使用 phpmyadmin 在 localhost 创建数据库和表。(假设您使用的是 WAMP/LAMP)

现在,我的 php 文件是这样的:

   <?php 
$link=mysql_connect('localhost','root','password');// give your username & password
if (!$link) { 
    die('Could not connect to MySQL: ' . mysql_error()); 
}  
mysql_select_db("database_name"); 
$sql=mysql_query("SELECT * FROM Login_Table_name where user_name = '".$_REQUEST['username']."' and password = '".$_REQUEST['password']."'");
if (mysql_num_rows($sql) > 0) {
 echo "success";
}else{
echo "login failed"; 
}
mysql_close($link); 
?>

(假设您知道将 php 文件放在哪里,对于 localhost)(WAMP/LAMP 的 www 文件夹)

现在,回到 java,将这些步骤保持原样。并将代码从这里更改为

HttpResponse response = httpclient.execute(httppost);
HttpEntity entity=response.getEntity();
String res=EntityUtils.toString(entity);
if(res.contains("success")){
//login success
}
else{
//loginfailed
}

现在您可以说出如何存储用户名和密码了。是的,只需创建另一个注册表单,包装名称值对并发送到另一个 php,其中 sql 查询将更改为“INSERT INTO”。

注意:如果您在使用 API-14+ 的模拟器上运行它,您将得到一个异常 - 主线程上的网络异常。你必须使用 AsynvTask。所以试试 API-10。

编辑:

如果您需要从服务器返回一些值,请编码为 JSON 并发送。变化将是,

php

if(mysql_num_rows($sql)>0){
    while($row=mysql_fetch_assoc($sql)){// you can use either fetch_assoc or fetch_array
    $result[]=$row;
    }
echo json_encode($result);
}

爪哇

String res=EntityUtils.toString(entity);
Log.d("TAG","From server:"+res);// to see what server sent
if( ! res.contains("login failed")){
JSONArray jArray = new JSONArray(res); 
if(jArray!=null){
            for(int i=0;i<jArray.length();i++){
                JSONObject jobj = jArray.getJSONObject(i);
                //now, you catch the values using column_name. As,
id=jobj.getInt("_id");name= jobj.getString("Name");
//Note that here _id,Name are column names. Refer server result in logcat for better understanding
            }
}

}
于 2013-07-31T18:02:59.747 回答