Androidがサーバにアップロードした簡単な例


最近ずっと任務を完成して、Androidの携帯電話のファイルの伝送について、今先に1歩して、携帯電話がpc端にファイルをアップロードすることができることを実現しました.まず簡単に紹介しましょう.パソコンに設置されたpc端末、Android携帯電話で動作するクライアント、pc端末はjava言語で作成され、クライアント側はcとjavaのJNIを組み合わせて作成されています.どうしてこんなに特殊ですか~ほほほ、完全に任務の要求の需要からです!まずコードをつけましょう.こちらは考えがはっきりするようにクライアントのコードを上から下へ
 
package zeng.Glogo.learn;  import java.util.ArrayList;  import java.util.List;  import android.app.Activity;  import android.app.ProgressDialog;  import android.os.Bundle;  import android.util.Log;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.AdapterView;  import android.widget.AdapterView.OnItemSelectedListener;  import android.widget.ArrayAdapter;  import android.widget.Button;  import android.widget.Spinner;  import android.widget.Toast;  public class JniClient_File extends Activity {  static{  System.loadLibrary("FileOperation");  }

私が自分で作ったパッケージ、そして必要なパッケージ~static{}内のコードはjniで書かれた静的ライブラリです~
public String IPAddress="";  public int PORT;  private EditText editText1=null;  private EditText editText2=null;  private Spinner spinner=null;  private Button send=null;  private EditText editText3=null;  private EditText editText4=null;  private Button sure=null;  private Button connect=null;   //  1  private Button disconnect=null; //  2  private Button exit=null;  FileOperation fileOperation=new FileOperation();   //          ,  3  private ProgressDialog progressdialog;  

 
 
これらはすべて簡単でしょう~
 
private static final String file_Selected[]={    "          ","HelloJni.c","HelloNDK.c","HelloCDT.txt","HelloJava.java","Hello.txt","hellop.txt"    };    private static final String filePath[]={    " ","/mnt/sdcard/HelloJni.c","/mnt/sdcard/HelloNDK.c","/mnt/sdcard/HelloCDT.txt","/mnt/sdcard/HelloJava.java",    "/mnt/sdcard/Hello.txt","/mnt/sdcard/hellop.txt"    };    private ArrayAdapter<String> adapter;   //           private List<String> fileNamesList;      //List  ,          

 
 
 
ArrayAdapterとListがあって、みんなはやっと出てきたこれらはすべてSpinnerのために準備したのではないでしょうか~ソースコードの印刷を見ますか?
 /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    //     ID          editText1=(EditText)findViewById(R.id.file_name);    editText2=(EditText)findViewById(R.id.file_seletced);    spinner=(Spinner)findViewById(R.id.spinner);    send=(Button)findViewById(R.id.send);    editText3=(EditText)findViewById(R.id.ip);    editText4=(EditText)findViewById(R.id.port);    sure=(Button)findViewById(R.id.sure);    //progressbar=(ProgressBar)findViewById(R.id.progressBar);    connect=(Button)findViewById(R.id.connect);    disconnect=(Button)findViewById(R.id.disconnect);    exit=(Button)findViewById(R.id.exit);    //   List        fileNamesList=new ArrayList<String>();    for(int i=0;i<file_Selected.length;i++){    fileNamesList.add(file_Selected<i>);    }    //         adapter=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, file_Selected);    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);    // Spinner         spinner.setAdapter(adapter);    // Spinner          spinner.setOnItemSelectedListener(new OnItemSelectedListener() {    @Override    public void onItemSelected(AdapterView<?> arg0, View arg1,    int arg2, long arg3) {    // TODO Auto-generated method stub    //arg2             //arg0 spinner             if(arg2!=0){    editText1.setText(filePath[arg2]);    editText2.setText(file_Selected[arg2]);    arg0.setVisibility(View.VISIBLE);    }else{    editText1.setText("");    editText2.setText("");    editText1.setHint(R.string.file_name_hint);    editText2.setHint(R.string.file_seletced_hint);    arg0.setVisibility(View.VISIBLE);    }    }    @Override    public void onNothingSelected(AdapterView<?> arg0) {    // TODO Auto-generated method stub    //              ,  google ~    }    });</i>                           Android    ,      ~                  ~          ?01 //    exit.setOnClickListener(new OnClickListener() {  @Override  public void onClick(View v) {  // TODO Auto-generated method stub  JniClient_File.this.finish();  }  });  //  IP      sure.setOnClickListener(new OnClickListener() {  @Override  public void onClick(View v) {  // TODO Auto-generated method stub  IPAddress=editText3.getText().toString();  PORT=Integer.decode(editText4.getText().toString());  editText3.setText("");  editText4.setText("");  editText3.setHint(IPAddress);  String port=String.valueOf(PORT);  //EditText    Editable。  String  ,               editText4.setHint(port);  Toast toast=Toast.makeText(JniClient_File.this,  "IP  ;"+IPAddress+"
"+" :"+PORT, Toast.LENGTH_LONG); toast.show(); } }); // connect.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String str1=fileOperation.connect(IPAddress,PORT); if(str1.endsWith("101")){ Toast toast=Toast.makeText(JniClient_File.this, str1+" ", Toast.LENGTH_LONG); toast.show(); } else{ Toast toast=Toast.makeText(JniClient_File.this, str1+" ", Toast.LENGTH_LONG); toast.show(); } } }); // disconnect.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String str2=fileOperation.disconnect(); if(str2.endsWith("102")){ Toast toast=Toast.makeText(JniClient_File.this, str2+" ",Toast.LENGTH_LONG); toast.show(); }else{ Toast toast=Toast.makeText(JniClient_File.this, str2+" ", Toast.LENGTH_LONG); toast.show(); } } });

 
皆さんは主にdisconnectと接続connectを切断する機能がjniで作成したその静的ライブラリ(FileOperation)を呼び出して実現されているのではないでしょうか.そして、対応するエラーメッセージがあります.次は最後のボタンsend~ソースコードの印刷を表示しますか.
 send.setOnClickListener(new OnClickListener() {    @Override    public void onClick(View v) {    // TODO Auto-generated method stub    String str3=editText1.getText().toString();   //        String str4=editText2.getText().toString()+"\r
"; //   //String str4=editText2.getText().toString();   int total=fileOperation.fileOperatin(str3,str4);   if(total<=0){   Toast toast=Toast.makeText(JniClient_File.this, " "+total, Toast.LENGTH_LONG);   toast.show();   }   else{   Toast toast=Toast.makeText(JniClient_File.this, "the total is"+total, Toast.LENGTH_LONG);   toast.show();   progressdialog=new ProgressDialog(JniClient_File.this);   progressdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);   progressdialog.setTitle(" ");   progressdialog.setMessage("~ ~");   progressdialog.setIcon(R.drawable.android1);   progressdialog.setProgress(100);   progressdialog.setIndeterminate(false);   progressdialog.setCancelable(false);   progressdialog.show();   Log.d("DUBUG", "total is"+total);   new Thread(){   int count=0;   public void run() {   // TODO Auto-generated method stub   try{   while(count<100)   {   progressdialog.setProgress(count+=4);   Thread.sleep(100);   }   progressdialog.cancel();   }catch(InterruptedException e){   e.printStackTrace();   }   }   }.start();   }   }   });   }   }

 
これは簡単でしょう~送信したものは交友jniが書いた静待庫に行きました~それはユニークなバイト数を返してToastが出てきて、これは私たちが統計するのに便利です~もう一つのprogredialogがあります.ええと、これは・・・美化してみましょう.実は何の役にも立たないです.クライアントjavaの部分はここまでです.次はメインイベントの一つです.FileOperation.そ了!!引き続きコードをつけて、みんなはJNIに対して熟知していないならば先に行って少し理解することができます
 #include<sys/socket.h>    #include<sys/types.h>    #include<sys/stat.h>    #include<stdio.h>    #include<stdlib.h>    #include<unistd.h>    #include<string.h>    #include<arpa/inet.h>    #include<sys/wait.h>    #include<netinet/in.h>    #include "zeng_Glogo_learn_FileOperation.h"    #define MAXBUF 1024    #define FILEPATH 255    #define FILENAME 255    int sockfd;    unsigned char buffer[MAXBUF];    char *end;    unsigned char end_buf[29];    struct sockaddr_in client_addr;    jint Java_zeng_Glogo_learn_FileOperation_fileOperatin    (JNIEnv *env, jobject thiz, jstring FilePath,jstring FileName)    {    const char *filepath_buf=(*env)->GetStringUTFChars(env,FilePath,0);    char filepath[FILEPATH];    strcpy(filepath,filepath_buf);    (*env)->ReleaseStringUTFChars(env,FilePath,filepath_buf);    const char *filename_buf=(*env)->GetStringUTFChars(env,FileName,0);    char filename[FILENAME];    memset(filename,0,FILENAME);    strncpy(filename,filename_buf,strlen(filename_buf));    (*env)->ReleaseStringUTFChars(env,FileName,filename_buf);    //      ,           FILE *fp;    fp=fopen(filepath,"rb");    if(!fp)    {    return -1;    }    int file_name=send(sockfd,filename,strlen(filename),0);   //         if(file_name<0)    {    return -2;    }    //int file_block_length=0;    int count=0;                                  //           int ReadNum=0;    int ReadSum=0;    unsigned char LenBuffer[1];    while(!feof(fp))  //        buffer     {    ReadNum=fread(buffer,1,MAXBUF,fp);    ReadSum+=ReadNum;    if(ReadNum>0)    {    if(send(sockfd,buffer,ReadNum,0)==-1)    {    fclose(fp);    return -3;    }    bzero(buffer,MAXBUF);    count++;    }    else    {    fclose(fp);    break;    }    }    //bzero(buffer,MAXBUF);    /*end="EndLessLimiteFromGlogoPassion";    strcmp(end_buf,end);    send(sockfd,end_buf,29,0);*/    //send(sockfd,end_buf,strlen(end_buf),0);    fclose(fp);    return ReadSum;    }    jstring Java_zeng_Glogo_learn_FileOperation_connect    (JNIEnv *env, jobject thiz, jstring IPAddress, jint PORT)    {    //  String      const char * ipaddress_buf=(*env)->GetStringUTFChars(env,IPAddress,0);    char ipaddress[255];    strcpy(ipaddress,ipaddress_buf);    (*env)->ReleaseStringUTFChars(env,IPAddress,ipaddress_buf);    int port=PORT;    bzero(&client_addr,sizeof(client_addr));             //              0    /* AF_INET     struct sockaddr_in    {    short int             sin_family;   //AF_INET    unsigned short int    sin_port;     //Port number    struct in_addr{    unsigned  long       s_addr        //Internet address    }    }*/    sockfd=socket(AF_INET,SOCK_STREAM,0);    if(sockfd<0)    {    return (*env)->NewStringUTF(env,"Socket Error 101");    }    client_addr.sin_family=AF_INET;                     //internet       client_addr.sin_port=htons(port);                   //       /*          client_addr.sin_addr.s_addr=inet_addr(ipaddress);    //  IP    inet_addr inet_aton               ,    //inet_addr    in_addr_t, inet_aton      ,             straddr     //in_addr_t inet_addr(const char* straddr)  ,   int inet_aton(const char* straddr,struct in_addr *addrp)    //  ,sin_addr.s_addr=htonl(INADDR_ANY)  */    if(inet_aton(ipaddress,&client_addr.sin_addr)<0)    {    return (*env)->NewStringUTF(env,"inet_aton Error 101");    }    if(connect(sockfd,(struct sockaddr*)&client_addr,sizeof(client_addr))<0)    {    return (*env)->NewStringUTF(env,"Connect Error 101");    }    else    {    return (*env)->NewStringUTF(env,"Connec OK!");    }    }    jstring Java_zeng_Glogo_learn_FileOperation_disconnect    (JNIEnv *env, jobject thiz)    {    close(sockfd);    return (*env)->NewStringUTF(env,"Socket Close!");    }  

 
皆さんは見たはずです~これらはすべてLinuxの下でCプログラミングのいくつかの簡単なもので、ここで説明して、jint Java_zeng_Glogo_learn_FileOperation_FileOperatin関数のcount変数は何の役にも立たないので、削除するのがおっくうです.ファイルを送信する側には何もありません.転送されたファイルパスFilePathに基づいてファイルを開いて内容を読み取り、ファイル名をサービス側に送信します.それから!fpの場合は次のsendだけです.う~んクライアントのはここまで!!以下はサービス端です~ここで私は長い間悩んでいましたが、後でやっと問題を発見しました.送信側が送信するバイト数は正しいですが、受信側はjavaで書かれているので、伝達されたときに基本データ型の変換問題に関わることがあります.これは古い問題です~しかし、基礎がしっかりしていない私は無視しました~ここで多くの時間を費やしました.よし~コードをつけよう~!ソース印刷の表示
 package learn;    import java.io.BufferedInputStream;    import java.io.BufferedOutputStream;    import java.io.BufferedReader;    import java.io.BufferedWriter;    import java.io.DataInputStream;    import java.io.File;    import java.io.FileOutputStream;    import java.io.FileWriter;    import java.io.IOException;    import java.io.InputStreamReader;    import java.net.ServerSocket;    import java.net.Socket;    import java.nio.ByteBuffer;    public class JniServer_File implements Runnable{    int PORT=8888;    /**    * @param args    */    @Override    public void run() {    // TODO Auto-generated method stub    try{    System.out.println("           ...");    System.out.println("----  ----  ----  ----");    ServerSocket serverSocket=new ServerSocket(PORT);    while(true){    Socket client=serverSocket.accept();    System.out.println("              ...");    System.out.println("----  ----  ----  ----");    System.out.println("           。。");    System.out.println("----  ----  ----  ----");    BufferedInputStream filename=new BufferedInputStream(client.getInputStream());    System.out.println("            (   )...");    System.out.println("----  ----  ----  ----");    byte file_name[]=new byte[255];    filename.read(file_name);    String file_name_trans=new String(file_name);    System.out.println("             ,    "+new String(file_name));    System.out.println("----  ----  ----  ----");    try{    if(file_name_trans!=""){    System.out.println("            .. "+file_name_trans);    String file="D:/Eclipse/test/HelloCDT.txt";        //           File newFile=new File(file);               //          if(newFile.exists())    {    //                  newFile.createNewFile();    }    System.out.println("----  ----  ----  ----");    System.out.println("----  ----  ----  ----");    System.out.println("              ,             ");    BufferedOutputStream file_context_in_buf=new BufferedOutputStream(new FileOutputStream(file,false));    System.out.println("----  ----  ----  ----");    System.out.println("                ...");    int count=0;                          //          byte[] file_context=new byte[1024];    while(filename.read(file_context)>0){                     //        ,                 count++;    System.out.println("    read times for "+count);    String end_buf_str=new String(file_context);    if(end_buf_str.contains("END")){    int len=end_buf_str.lastIndexOf("END");    String end_buf_str1=end_buf_str.substring(0, len+3);    byte end_buf_byte[]=end_buf_str1.getBytes();    file_context_in_buf.write(end_buf_byte);    System.out.println("    write times for "+count);    System.out.println("    This times is "+count);    System.out.println("----  ----  ----  ----");    break;    }    file_context_in_buf.write(file_context);    System.out.println("    write times for "+count);    System.out.println("    This times is "+count);    System.out.println("----  ----  ----  ----");    }    file_context_in_buf.flush();    System.out.println("    file_context_in_buf flush times for "+count);    System.out.println("----  ----  ----  ----");    System.out.println("           ,       ..."+count);    System.out.println("----  ----  ----  ----");    System.out.println("              ...");    System.out.println("----  ----  ----  ----");    file_context_in_buf.close();         //               filename.close();    file_name_trans="";    }    }    catch(IOException e){    e.printStackTrace();    System.out.println(e.getMessage()+" ---1");    }    finally{    client.close(); //  socket    System.out.println("         ");    }    }    }    catch(Exception e){    e.printStackTrace();    System.out.println(e.getMessage()+" ---2");    }    }    public static void main(String[] args) {    // TODO Auto-generated method stub    Thread jniServer_File=new Thread(new JniServer_File());    jniServer_File.start  

 
Javaを熟知する学友は上のコードを知っているべきでしょう~比較的に特殊なのはクライアントsendを循環して受信することです()来たものは、こちらがちょっとサボっていたのですが、送信は.txtファイルが最後にENDで終わるので、これが便利になりました.これによっていつ終了するかを判断してファイルに内容を書き込むことができます.もう一つは、転送はバイト単位で転送されるので、Streanで受信と格納し、文字ストリームReaderでWriterも頼りにならない!この中にはStringとbyteタイプの転化問題も含まれています.私もここで長い間悩んでいました.ほほほ、みんなは先に噴かないでください.私は率直に私の基礎部がしっかりしています.はい、基本的にはこのようなものです.こちらの上図は面倒なので、図がないのは真相がない・・・まあいいか・・・・みんなそう思っても仕方がない・でも本人はもう試したよ~15014 KBのファイル一つと396800 KBのファイル転送一つで大丈夫だから、携帯電話に置いてテストしてもOK~上図は都合が悪いので、ここにmanを貼っておきます.xmlのコードはみんなにすべて全体のレイアウトがすべて少し理解するようにしましょう~ソースコードの印刷を表示します
 <?xml version="1.0" encoding="utf-8"?>    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical" >    <TextView    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:text="@string/hello"    android:id="@+id/tv" />    <TextView    android:layout_marginTop="15dp"    android:layout_below="@id/tv"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:id="@+id/dir"    android:text="@string/dir"/>    <EditText    android:layout_width="260dp"    android:layout_height="wrap_content"    android:hint="@string/file_name_hint"    android:id="@+id/file_name"    android:layout_below="@id/tv"    android:layout_toRightOf="@id/dir"/>    <TextView    android:layout_height="wrap_content"    android:layout_width="wrap_content"    android:text="@string/dir1"    android:layout_below="@id/dir"    android:id="@+id/dir1"    android:layout_marginTop="25dp"/>    <EditText    android:layout_width="260dp"    android:layout_height="wrap_content"    android:hint="@string/file_seletced_hint"    android:id="@+id/file_seletced"    android:layout_below="@id/file_name"    android:layout_toRightOf="@id/dir1"/>    <Spinner    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:id="@+id/spinner"    android:layout_below="@id/file_seletced"/>    <Button    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="@string/send"    android:id="@+id/send"    android:layout_below="@id/spinner"    android:layout_alignRight="@id/spinner"/>    <EditText    android:layout_height="wrap_content"    android:layout_width="150dp"    android:layout_below="@id/send"    android:layout_alignParentLeft="true"    android:hint="@string/ip"    android:id="@+id/ip"/>    <EditText    android:layout_height="wrap_content"    android:layout_width="80dp"    android:layout_toRightOf="@id/ip"    android:hint="@string/port"    android:layout_below="@id/send"    android:layout_marginLeft="5dp"    android:id="@+id/port"/>    <Button    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_toRightOf="@id/port"    android:layout_below="@id/send"    android:id="@+id/sure"    android:layout_alignParentRight="true"    android:text="@string/sure"/>    <!--  <ProgressBar    android:layout_height="wrap_content"    android:layout_width="fill_parent"    android:layout_below="@id/sure"    android:visibility="gone"    android:id="@+id/progressBar"    style="?android:attr/progressBarStyleHorizontal"    android:max="100"    android:progress="2"    android:secondaryProgress="4"/> -->    <Button    android:layout_width="90dp"    android:layout_height="wrap_content"    android:text="@string/exit"    android:id="@+id/exit"    android:layout_alignParentRight="true"    android:layout_alignParentBottom="true"/>    <Button    android:layout_width="120dp"    android:layout_height="wrap_content"    android:text="@string/disconnect"    android:id="@+id/disconnect"    android:layout_toLeftOf="@id/exit"    android:layout_alignParentBottom="true"/>    <Button    android:layout_height="wrap_content"    android:layout_width="120dp"    android:text="@string/connect"    android:id="@+id/connect"    android:layout_toLeftOf="@id/disconnect"    android:layout_alignParentBottom="true"/>    </RelativeLayout>