版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/casgj16/article/details/80304673
查阅了很多资料,修改了别人的代码,终于实现了android向阿里云服务器的数据传输功能。以下说说自己的步骤:
1、软硬件环境
- Android Studio 3.2.2
- 阿里云服务器 ( Windows Sever 2012 )
- 软件集成包XAMPP(Apach、 MySql)
- 小米4
2、创建MySQL数据库 persondb 以及 表 persons
3、服务器端代码
a.先写个配置文件db_config.php
<?php
define('DB_USER', "root"); // db user
define('DB_PASSWORD', "root"); // db password (mention your db password here)
define('DB_DATABASE', "persondb"); // database name
define('DB_SERVER', "localhost"); // db server
?>
b.连接MySQL数据库的文件db_connect.php
<?php
function connect() {
/*包含并运行指定的文件*/
// import database connection variables
require_once __DIR__ . '/db_config.php';
global $con;
// Connecting to mysql database
$con = mysqli_connect(DB_SERVER, DB_USER, DB_PASSWORD) or die(mysqli_connect_error());
// Selecing database
$db = mysqli_select_db($con,DB_DATABASE) or die(mysqli_error($con)) ;
// returing connection cursor
return $con;
}
/**
* Function to close db connection
*/
function close() {
// closing db connection
global $con;
mysqli_close($con);
}
?>
c. Android客户端从MySQL数据库里获取数据的文件get_all_persons.php
<?php
/*
* Following code will list all the products
*/
// array for JSON response
$response = array();
// include db connect class
require_once __DIR__ . '/db_connect.php';
// connecting to db
connect();
// get all products from products table
$result = mysqli_query($con,"SELECT *FROM persons") or die(mysqli_error());
// check for empty result
if (mysqli_num_rows($result) > 0) {
// looping through all results
// products node
$response["persons"] = array();
while ($row = mysqli_fetch_array($result)) {
// temp user array
$info = array();
$info["Id_P"] = $row["Id_P"];
$info["LastName"] = $row["LastName"];
$info["FirstName"] = $row["FirstName"];
$info["Address"] = $row["Address"];
$info["City"] = $row["City"];
// push single product into final response array
array_push($response["persons"], $info);
}
// success
$response["success"] = 1;
// echoing JSON response
echo json_encode($response);
} else {
// no products found
$response["success"] = 0;
$response["message"] = "No products found";
// echo no users JSON
echo json_encode($response);
}
close();
?>
d.Android客户端向MySQL数据库插入数据的文件create_person.php
<?php
$result = file_get_contents('php://input');
$object=json_decode($result);
$Id_P = $object->{'Id_P'};
$LastName=$object->{'LastName'};
$FirstName=$object->{'FirstName'};
$Address=$object->{'Address'};
$City=$object->{'City'};
/*
* Following code will create a new person row
* All person details are read from HTTP Post Request
*/
// array for JSON response
$response = array();
// check for required fields
if (isset($Id_P) || isset($LastName) || isset($FirstName) || isset($Address) || isset($City)) {
// include db connect class
require_once __DIR__ . '/db_connect.php';
// connecting to db
connect();
// mysql inserting a new row
$result = mysqli_query($con,"INSERT INTO persons(Id_P,LastName,FirstName,Address,City) VALUES('$Id_P', '$LastName','$FirstName','$Address','$City')");
// check if row inserted or not
if ($result) {
// successfully inserted into database
$response["success"] = 1;
$response["message"] = "Person successfully created.";
// echoing JSON response
echo json_encode($response);
} else {
// failed to insert row
$response["success"] = 0;
$response["message"] = "Oops! An error occurred.";
// echoing JSON response
echo json_encode($response);
}
} else {
// required field is missing
$response["success"] = 0;
$response["message"] = "Required field(s) is missing";
// echoing JSON response
echo json_encode($response);
}
?>
注意: 创建一个文件夹android_connect,把以上的所有php文件都放在该文件夹里,并把android_connect 文件夹放在xampp安装目录里htdocs文件夹下。
4.Android客户端通过网络访问MySQL数据库
先上布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.android.androidconnectserver.MainActivity">
<Button
android:text="向MYSQL数据库插入数据"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/Send"
/>
<Button
android:text="从MYSQL数据库获取数据"
android:layout_below="@id/Send"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/Receive"
/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/Receive"
android:layout_marginTop="5dp"
android:text="textView"
android:textSize="20sp"/>
</RelativeLayout>
该布局文件是Android客户端向MySQL数据库插入数据时的一个自定义对话框的布局文件dialog_custom.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:paddingLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Id_P :"
/>
<EditText
android:id="@+id/et_Id_P"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:hint="请输入信息"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:paddingLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LastName :"
/>
<EditText
android:id="@+id/et_LastName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:hint="请输入信息"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:paddingLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="FirstName :"
/>
<EditText
android:id="@+id/et_FirstName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:hint="请输入信息"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:paddingLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Address :"
/>
<EditText
android:id="@+id/et_Address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:hint="请输入信息"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:paddingLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="City :"
/>
<EditText
android:id="@+id/et_City"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:hint="请输入信息"/>
</LinearLayout>
</LinearLayout>
最后出场Android端的代码,各位小伙伴们注意了。
package com.android.androidconnectserver;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
public static final String TAG="MainActivity";
private Button Send;
private Button Receive;
private TextView textView;
private String response;
private EditText inputId_P;
private EditText inputLastName;
private EditText inputFirstName;
private EditText inputAddress;
private EditText inputCity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
Receive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
receive();
textView.setText(response);
}
});
Send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog();
}
});
}
public void initViews(){
Send =(Button) findViewById(R.id.Send);
Receive= (Button) findViewById(R.id.Receive);
textView=(TextView) findViewById(R.id.textView);
}
/*从MySQL里获取数据*/
private void receive() {
new Thread(
new Runnable() {
@Override
public void run() {
response=executeHttpGet();
}
}
).start();
}
private String executeHttpGet() {
HttpURLConnection con=null;
InputStream in=null;
String path="http://127.0.0.1/android_connect/get_all_persons.php";
try {
con= (HttpURLConnection) new URL(path).openConnection();
con.setConnectTimeout(5000);
con.setReadTimeout(5000);
con.setDoInput(true);
con.setRequestMethod("GET");
if(con.getResponseCode()==200){
in=con.getInputStream();
return parseInfo(in);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private String parseInfo(InputStream in) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(in));
StringBuilder sb=new StringBuilder();
String line=null;
while ((line=br.readLine())!=null){
sb.append(line+"\n");
}
Log.i(TAG, "parseInfo: sb:"+sb.toString());
return sb.toString();
}
/*发送数据给MySQL数据库*/
private void showDialog(){
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
builder.setTitle("添加个人信息");
View view= View.inflate(MainActivity.this,R.layout.dialog_custom,null);
builder.setView(view);
builder.setPositiveButton("确定", new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
String Id_P=inputId_P.getText().toString();
String LastName=inputLastName.getText().toString();
String FirstName=inputFirstName.getText().toString();
String Address=inputAddress.getText().toString();
String City=inputCity.getText().toString();
try {
jsonObject.put("Id_P",Id_P);
jsonObject.put("LastName",LastName);
jsonObject.put("FirstName",FirstName);
jsonObject.put("Address",Address);
jsonObject.put("City",City);
} catch (JSONException e) {
e.printStackTrace();
};
send();
}
});
builder.setNegativeButton("取消",new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog ad=builder.create();
ad.show();
inputId_P= (EditText)ad.findViewById(R.id.et_Id_P);
inputLastName= (EditText)ad.findViewById(R.id.et_LastName);
inputFirstName= (EditText)ad.findViewById(R.id.et_FirstName);
inputAddress= (EditText)ad.findViewById(R.id.et_Address);
inputCity= (EditText)ad.findViewById(R.id.et_City);
}
private void send() {
new Thread(new Runnable() {
@Override
public void run() {
executeHttpPost();
}
}).start();
}
JSONObject jsonObject=new JSONObject();
private void executeHttpPost() {
String path="http://127.0.0.1/android_connect/create_person.php";
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//conn.setConnectTimeout(3000); //设置连接超时时间
conn.setDoOutput(true); //打开输出流,以便向服务器提交数据
conn.setDoInput(true); //打开输入流,以便从服务器获取数据
conn.setUseCaches(false);//使用Post方式不能使用缓存
conn.setRequestMethod("POST"); //设置以Post方式提交数据
//conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Charset", "UTF-8");
// 设置文件类型:
//conn.setRequestProperty("Content-Type","application/json; charset=UTF-8");
// 设置接收类型否则返回415错误
//conn.setRequestProperty("accept","*/*")此处为暴力方法设置接受所有类型,以此来防范返回415;
conn.setRequestProperty("accept","application/json");
// 往服务器里面发送数据
String Json=jsonObject.toString();
System.out.println("----------- "+Json);
if (Json != null && !TextUtils.isEmpty(Json)) {
byte[] writebytes = Json.getBytes();
// 设置文件长度
conn.setRequestProperty("Content-Length", String.valueOf(writebytes.length));
OutputStream outwritestream = conn.getOutputStream();
outwritestream.write(Json.getBytes());
outwritestream.flush();
outwritestream.close();
Log.d("upload: ", "doJsonPost: "+conn.getResponseCode());//如输出200,则对了
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.运行结果
a.向MySQL数据库插入数据
点击向MySQL数据库插入数据的按钮,在里面输入数据,单击确定就可以向数据库中插入数据了,通过查询数据库,可以查看数据是否插入成功。