Android实现与PHP服务器的交互

今天算是有点小激动呢!拿到Android与PHP这个课题已经两个星期了,直到今天才算是有了一点点小收获。

虽然还是没能成功上传到服务器,不过已经看到了曙光,已经实现了一半了,那就是已经连接到了服务器。不

说废话了,还是写点自己的记录吧!

如果想要实现Android与PHP的交互我们首先应该知道一个叫AsynTask的抽象类。

下面是我的笔记:

为了方便在子线程中对UI进行操作,Android提供了一些好用烦人工具类,AsynTask就是其中之一。借助AsynTask
,可以十分简单地从子线程切换到主线程,它的原理也是基于异步消息处理机制的。
AsynTask的基本用法:
1.AsynTask是一个抽象类,因此使用它必须要创建一个类去继承它。在继承AsynTask时,可以为其指定三个泛型
参数,这三个参数的用途如下所示:
Params:在执行AsynTask时需要传入的参数,用于后台的任务中使用。
Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用该参数作为进度单位。
Result:当任务执行完毕后,如果需要对结果进行返回,则使用该参数作为返回值类型。
例如:class DownLoadTask extends  AsynTask<void,Integer,Boolean>{
              ...

}
通常使用AsynTask时,需要重写它的4个方法。
1.onPreExcute():这个方法在后台任务执行之前调用,一般用于界面上初始化操作,例如,显示一个
进度条对话框等。
2.doInBackground(Params...):这个方法在子线程中运行,用于处理耗时操作,操作一旦完既可以
通过return语句将任务的执行结果返回。如果AsynTask的第三个泛型参数指定的是void则可以不用返回
结果。需要注意的是,这个方法不能进行更新UI操作,如果要在该方法中更新UI可以手动调动
publishProgress(Progress...)方法来完成。
3.onProgressUpdate(Progress...):如果在doInBackground(Params...)方法中调用了publishProgress
(Progress...)方法,这个方法就会很快被调用,方法中携带的参数就是后台任务中传递过来的
在这个方法可以对UI进行操作,利用参数Progress就可以对UI进行相应的更新。
4.onPostExcute(Result):当doInBackground(Params...)执行完毕通过return语句进行返回时,这个
方法会很快被调用。在doInBackground(Params...)中返回的数据会作为参数传递到该方法中。此时
可以利用返回的参数来进行UI操作,例如,提醒某个任务完成了。
package com.itcast.asyntask;

import android.os.AsyncTask;
import android.widget.Toast;

public class DownLoadTask extends AsyncTask<Void,Integer,Boolean>{
    protected void onPreExecute(){
        progressDialog.show();
    }
    
    @Override
    protected Boolean doInBackground(Void... params) {
        // TODO Auto-generated method stub
        while(true){
            int downloadPrecent = doDownload();
            publishProgress(downloadPrecent);
            if(downloadPrecent >= 100){
                break;
            }
        }
        
        return true;
    }
    protected void onProgressUpdate(Integer...values){
        progressDialog.setMessage("Download"+values[0]+"%");
    }
    protected void onPostExecute(Boolean result){
        progressDialog.dismiss();
        if(result){
            Toast.makeText(MainActivity.this, "下载成功", 0).show();
        }else{
            Toast.makeText(MainActivity.this, "下载失败", 0).show();
        }
    }

}
要执行DownLoadTask,还需要在UI线程中创建出DownLoadTask的实例,并调用DownLoadTask
实例的Excute()方法。代码如下:
new DownLoadTask().excute();
接下来是我的一个交互的小程序:

步骤为:1.写布局文件  2.写主程序  3.添加网络访问权限

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context=".MainActivity" >
10
11     <TextView
12         android:id="@+id/textView1"
13         android:layout_width="wrap_content"
14         android:layout_height="wrap_content"
15         android:textSize="20sp"
16         android:text="上传文件" />
17
18     <TextView
19         android:id="@+id/textView2"
20         android:layout_width="wrap_content"
21         android:layout_height="wrap_content"
22         android:layout_below="@+id/textView1"
23         android:text="TextView" />
24
25     <Button
26         android:id="@+id/button1"
27         android:layout_width="wrap_content"
28         android:layout_height="wrap_content"
29         android:layout_below="@+id/textView2"
30         android:text="确定上传" />
31
32
33 </RelativeLayout>
package com.itcastupfile;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private String uploadFile = "/mnt/sdcard/DCIM/Camera/IMG_20160406_114143.JPG";
    private String srcPath = "/mnt/sdcard/DCIM/Camera/IMG_20160406_114143.JPG";
    private String actionUrl = "http://10.6.78.90/xampp/sse/index.php/home/Index/upload_file";
    private TextView mText1;
    private TextView mText2;
    private Button mButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mText1 = (TextView)findViewById(R.id.textView1);
        mText1.setText("文件路径:\n"+uploadFile);
        mText2 = (TextView)findViewById(R.id.textView2);
        mText2.setText("上传网址:\n"+actionUrl);
        mButton = (Button)findViewById(R.id.button1);
        mButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                uploadFile(actionUrl);
                //FileUploadTask fileuploadtask = new FileUploadTask();
                //fileuploadtask.execute();
            }
        });
    }

   private  void uploadFile(String actionUrl) {
        // TODO Auto-generated method stub
       String end = "\r\n";
        String twoHyphens = "--";
        String boundary = "******";
       try{
        URL url = new URL(actionUrl);
          HttpURLConnection httpURLConnection = (HttpURLConnection) url
              .openConnection();
          // 设置每次传输的流大小,可以有效防止手机因为内存不足崩溃
          // 此方法用于在预先不知道内容长度时启用没有进行内部缓冲的 HTTP 请求正文的流。
          httpURLConnection.setChunkedStreamingMode(128 * 1024);// 128K
          // 允许输入输出流
          httpURLConnection.setDoInput(true);
          httpURLConnection.setDoOutput(true);
          httpURLConnection.setUseCaches(false);
          // 使用POST方法
          httpURLConnection.setRequestMethod("POST");
          httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
          httpURLConnection.setRequestProperty("Charset", "UTF-8");
          httpURLConnection.setRequestProperty("Content-Type",
              "multipart/form-data;boundary=" + boundary);

          DataOutputStream dos = new DataOutputStream(
              httpURLConnection.getOutputStream());
          dos.writeBytes(twoHyphens + boundary + end);
          dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\""
              + srcPath.substring(srcPath.lastIndexOf("/") + 1)
              + "\""
              + end);
          dos.writeBytes(end);

          FileInputStream fis = new FileInputStream(srcPath);
          byte[] buffer = new byte[8192]; // 8k
          int count = 0;
          // 读取文件
          while ((count = fis.read(buffer)) != -1)
          {
            dos.write(buffer, 0, count);
          }
          fis.close();

          dos.writeBytes(end);
          dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
          dos.flush();

          InputStream is = httpURLConnection.getInputStream();
          InputStreamReader isr = new InputStreamReader(is, "utf-8");
          BufferedReader br = new BufferedReader(isr);
          String result = br.readLine();

          Toast.makeText(this, result, Toast.LENGTH_LONG).show();
          dos.close();
          is.close();

        } catch (Exception e)
        {
          e.printStackTrace();
          setTitle(e.getMessage());
        }
      }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
    <uses-permission android:name="android.permission.INTERNET" />

下面是我的运行结果:

看到的那个Toast就是PHP端的代码,判断是否上传成功!

不过此程序仍然存在问题就是无法显示上传成功,问题还在查询当中。

不过已经算是实现交互的功能了。接下来就是查找上传不成功的原因了。

时间: 2024-10-31 15:05:33

Android实现与PHP服务器的交互的相关文章

android通过HttpClient与服务器JSON交互

通过昨天对HttpClient的学习,今天封装了HttpClient类 代码如下: package com.tp.soft.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apach

Android客户端与PC服务器通过socket进行交互实例(转)

一直以来对Android socket通信都很模糊,今天终于研究了一个网上的例子,自己又修改了下,算是对Android socket通信有点了解了. 下面是具体的代码,说明都在注释中了.需要注意的是,只有客户端发送了信息给服务器后,服务器才能响应客户端的输入,然后返回信息给客户端,这是客户端才能读取服务器返回的信息.如果客户端和服务器都处于等待对方的信息,那样就会造成阻塞,导致ANR了. 1.服务器端代码,就是一个java程序,与android无关,运行于服务器上,即PC机上. [java] v

Android网络(3):HttpClient作客户端,Tomcat Servlet作服务器的交互示例

前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后台服务器用Eclipse的JavaEE版最好的,但单就Tomcat来说(不写jsp之类的),本文下面的服务器方面操作在普通版的Eclipse也是可以的.我这里为了和ADT-bundle分开,特意重新安个JavaEE版的Eclipse.] 1.下载Eclipse的Tomcat插件:http://www

Android客户端与本地服务器Socket通信

Android客户端与本地服务器Socket通信 Socket服务器运行结果图?? 一.客户端和服务器端的选择: 客户端是我们手机端,关于服务器端,只要安装了JDK,自然就拥有通讯的功能,我们只需要在Eclipse或者MyEclipse中写好文章中服务器端的代码,运行起来即可,用accept()方法启动服务器端,等待客户端的连接,在未连接的情况下,服务器端处于堵塞的状态. 二.客户端注意事项 andriod客户端添加网络访问权限 <uses-permission android:name="

Android SDK 在线更新镜像服务器资源

Android SDK 在线更新镜像服务器资源: 大连东软信息学院镜像服务器地址: http://mirrors.neusoft.edu.cn 端口:80 北京化工大学镜像服务器地址: IPv4: http://ubuntu.buct.edu.cn/ 端口:80 IPv4: http://ubuntu.buct.cn/ 端口:80 IPv6: http://ubuntu.buct6.edu.cn/ 端口:80 上海GDG镜像服务器地址: http://sdk.gdgshanghai.com 端口

Android提交数据到服务器的两种方式四种方法

Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方式向服务器提交数据的方法. /** * @author Dylan * 本类封装了Android中向web服务器提交数据的两种方式四种方法 */ public class SubmitDataByHttpClientAndOrdinaryWay { /** * 使用get请求以普通方式提交数据 * @param map 传递进来的数据,以map的形式进行了封装 * @p

Android:解决客户端从服务器上获取数据乱码的方法

向服务器发送HTTP请求,接收到的JSON包为response,用String content = EntityUtils.toString(response.getEntity(),"utf-8");解码还是出现了中文乱码,在后面加了 String name = new String(response.getBytes("iso-8859-1"), "UTF-8"); 也无济于事.想到服务器好像是用URLENCODER编了码的,怀着试一试的态度

Android SDK 更新镜像服务器

搞个新的电脑,新环境下,SDK总是更新不成功.找了一下,发现有国内的镜像,记录保存一下. Android Tools Android SDK在线更新镜像服务器    中国科学院开源协会镜像站地址:        IPV4/IPV6: http://mirrors.opencas.cn 端口:80        IPV4/IPV6: http://mirrors.opencas.org 端口:80        IPV4/IPV6: http://mirrors.opencas.ac.cn 端口:

使用XML与远程服务器进行交互

最近在做的一个项目其中的一部分是与远程服务器进行交互,确定身份验证的合法性,于是编写了SendRequest方法 此方法发送给远程服务器XML请求,服务器经过处理后,返回XML回应,由此方法接收到后进行返回. 1 protected string SendRequest(string strXML)  2     {  3         string str = ""; //双方协定的XML格式  4         Encoding encoding = Encoding.UTF8