この記事の例は、ソケットを使用してJavaのプロセスを共有して、参照用のダウンロード装置と関連コードを作成します。特定のコンテンツは次のとおりです
1.最初に、情報を処理してファイルをクライアント(コンピューター)に転送するサーバーを確立します
コンピューターを使用してWiFiをオンにしてから、電話に接続し、スコークを使用して送信しました。
ServerIPは、実際の状況に応じて変更する必要があります。ポートは意志で変更することもできます0〜65535、より大きなものを選択してみてください
java.io.bufferedinputStream; Import java.io.bufferedOutputStream; Import java.io.bufferedReader; Import java.io.BufferedReader; Import java.io.bufferedwriter; Import java.io.file; Import java.io.filetionputtremputreder; java.io.printwriter; Import java.net.serversocket;インポートjava.net.socket;/** * AndroidクライアントとPCサーバーのテストソケットサーバーを介して対話する:クライアント情報を受け取り、クライアントに返送し、@author ameyume * * */public class server emplements unnable {// define for public static static static static情報= define "192.168.155.1"; // 9888ポートpublic static final int serverport = 9888を定義します。 //ファイルプライベートファイルファイル= nullを定義します。 public static void main(string [] args){//スレッドを呼び出す方法を作成して、送信スレッドdesktopserverthread = new Server()を実行する方法を作成します。 desktopserverthread.start(); } public void run(){try {system.out.println( "s:connecting ... 9888"); // Socket Serversocket Serversocket = new Serversocket(serverport)を作成します。 while(true){//クライアントリクエストを受け入れるのを待ちましたsocket client = serversocket.accept(); system.out.println( "s:receming ... 9888"); try {//クライアント情報BufferedReader in = new BufferedReader(new inputStreamReader(client.getInputStream())); system.out.println( "s:クライアント情報を受信"); //クライアント情報の読み取り文字列str = in.readline(); string str1 = str.substring(0,2); string str2 = str.substring(2); System.out.println(str); //クライアントのリクエストに従って対応するファイルを見つけ、if(str.equals( "file_size")){//転送するファイルを定義します(ここにeディスクの下にファイルを書きました)file = new file( "e:// a file"); //入力fileinputStream fis = new fileinputStream(file); //出力ストリームbufferedinputStream bis = new BufferedInputStream(FIS); //転送されるファイルサイズを計算int sum = bis.abailable(); // intタイプのファイルサイズを文字列s = string.valueof(sum)に変換します。 System.out.println(s); //出力ストリームを作成してファイルサイズ情報printWriterを送信します= new PrintWriter(new BufferedWriter(new outputStreamWriter(client.getOutputStream())、true); //ファイルサイズの情報を送信してください。println(s); // close stream out.flush(); bis.close(); } else if(str1.equals( "ok")){int a = integer.parseint(str2); //クライアントがファイルサイズの値を受信した後、クライアントBufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream())によって送信された「OK」に従ってファイルを渡します。 system.out.println( "s:start transfer"); // if(true){//入力fileinputStream fis = new fileInputStream(file); // fis.skip(a)の前に転送されたバイトをスキップします。 //バッファー入力ストリームbufferedinputStream bis = new BufferedInputStream(FIS); int t = -1; while((t = bis.read())> = 0){bos.write(t); } string s = "Transmitted"; // bos.flush();を閉じます。 bis.close(); bos.close(); // serversocket.close(); system.out.println( "s:receece: '" + s + "'"); }} else {system.out .println( "クライアントから何も受信者ではありません!"); }} catch(Exception E){System.out.println( "s:error 1"); e.printstacktrace(); }最後に{client.close(); system.out.println( "s:done。"); }}} catch(Exception e){System.out.println( "s:error 2"); e.printstacktrace(); }}} 2。別のクライアントを作成し、Androidで書かれたMainActivity.javaを使用します(電話で実行します)
パッケージcom.xhy.zz; Import android.app.activity; Import android.content.intent; Import android.os.bundle; Import android.os.s.message; Import android.view.view; Import android.view.view.onclicklistener; Import.Widget.Button; Android.widget.textView;パブリッククラスのMainActivityはアクティビティを拡張します{// Handler public Static Handler MyHandler; //私的な意図の意図を定義します。 //コントロールを取得するprivate textView text_name; Private TextView Text_Percent;プライベートボタンbtn_start;プライベートボタンbtn_stop; //ファイルディスプレイプライベートTextView text_sel_file; @Override Protected void oncreate(bundle savedinstancestate){// todo auto-enerated method stub super.oncreate(savedinstancestate); setContentView(r.layout.activity_main); text_name =(textView)findViewById(r.id.text_name); text_percent =(textView)findViewById(r.id.text_percent); btn_start =(button)findViewById(r.id.btn_start); btn_stop =(button)findviewbyid(r.id.btn_stop); //ボタン1の情報を返し、進行状況を表示myhandler = new Handler(){@Override public void handlemessage(message msg){super.handlemessage(msg); if(msg.what == 0x0001){bundle data = msg.getData(); string str = data.getString( "value"); text_percent.settext(str); }}}}; // HelloService Intent = new Intent(this、downservice.class)を挿入します。 // [スタート]ボタンの設定イベントbtn_start.setonclicklistener(new onclickListener(){@Override public void onclick(View v){// Service StartService(Intent);}}); // STOPボタンを設定します[イベント]イベントBTN_STOP.SETONCLICKLISTENER(new onclickListener(){@Override public void onclick(View v){// Service StopService(Intent);}}); } / ****戻り値が返されると、コールバックメソッドはシステムによって自動的に呼び出されます* / @Overrideが保護されたvoid onactivityResult(int requestCode、int resultCode、Intent Intent){super.OnactivityResult(requestCode、resultCode、Intent); //要求コードが0 //である場合、返された結果コードは1 //要求されたアクティビティは複数の結果コードを返すことができますstring str = data.getString( "ファイル"); //データtext_sel_file.settext(str);を表示します。 }}} 3。Activity_main.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 Android:Orientation = "Vertical"> <LinearLayout Android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_margintop = "android:orientation =" horizontal "> <textview android:"@+_name " Android:layout_width = "160dp" android:layout_height = "wrap_content" android:layout_gravity = "center_vertical" android:text = "1" /> <textview android:id = "@+id /text_percent" android:layout_width = "50dp" "" "" Android:layout_height = "wrap_content" android:layout_gravity = "center_vertical" android:layout_marginleft = "android:text =" 0% "/> <lirayout android:layout_width =" wrap_content "android:layout_height =" lap_content " Android:layout_marginleft = "20dp" android:android = "Vertical"> <button android: "@+id /btn_start" android:layout_width = "wrap_content" android:layout_height = "wrap_content" Android:id = "@+id/btn_stop" android:layout_width = "wrap_content" android:layout_height = "android:text =" stop "/> </linearlayout> </linearlayout> </linearlayout> </linearlayout>
4.DownServiceは、スレッドがバックグラウンドでダウンロードを実行できるようにするために使用されます
パッケージcom.xhy.zz; Import java.io.bufferedinputStream; Import java.io.bufferedRear; Import java.io.bufferedReader; Import java.io.bufferedwriter; Import java.io.file; Import java.io.fileoutputtream; Import java.io.Ionputtream; java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;import android.app.Service;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.os.bundle; Import android.os.environment; Import android.os.ibinder; import android.os.message; import android.util.log; public class downservice {private static final string tag = "socket_android"; //優先メカニズムのファイル名操作public static final string final final final fient ferference_name = "downservice"; //操作モードfepreeceメカニズムpublic static int mode = context.mode_private; //スレッドプライベートスレッドworkthread; // filenameプライベート文字列filename = "file"; //ポート番号プライベートINTポート= 9888; private boolean isStop = false; / ****実装する必要があるメソッド*/ @Override public ibinder onbind(意図意図){return null; } @Override public void oncreate(){super.oncreate(); } @Override public int onstartCommand(Intent Intent、int flags、int startid){log.v( "tcp"、filename); //送信方法の作成runnable backgroundwork = new runnable(){@override public void run(){// settitle( "Test Socket Connection");ソケットソケット= null; SocketSocket1 = null; { / * *サーバーのIPアドレスを指定してください。このアドレスはLANアドレスです。 WiFiを使用してインターネットをサーフィンする場合、それはPCのWiFi IPアドレスです * IPConfigで表示したIPアドレスは次のとおりです。イーサネットアダプターワイヤレスネットワーク接続: *接続固有のDNSサフィックス。 :IPアドレス。 。 。 *。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。サーバーのIPとポートを使用してソケットオブジェクトを作成し、サーバーにリクエストを送信してファイルサイズ値Socket1 = new Socket(ServerAddr、Port)を取得します。文字列メッセージ= "--- test_socket_android ---"; log.d( "tcp"、 "c:sending: '" + message + "'"); //このオブジェクトを介して情報をサーバーに送信しますprintwriter out = new PrintWriter(new outputStreamWriter(socket1.getOutputStream())、true); //ユーザーが入力したコンテンツをServer Out.println( "file_size"); out.flush(); //サーバー情報BufferedReader in = new BufferedReader(new inputStreamReader(socket1.getInputStream())); //ファイルサイズの文字列str1 = in.readline()を取得します。 log.d( "tcp"、str1); //ファイルサイズをint-type int sum = integer.parseint(str1)に変換します。 log.d( "tcp"、str1); //入力ストリームin.close(); SharedPreferences sharedpreferences = getSharedPreferences(ferference_name、mode); sharedpreferences.editor editor = sharedpreferences .edit(); //送信されたバイトを取得しますint pre = sharedpreferences.getint( "downservice"、0); int _pre = pre; //サーバーに送信するために文字列に変換しますs = string.valueof(_pre); //サーバーのIPとポートを使用してソケットオブジェクトを確立し、サーバーに再度リクエストを送信してファイルコンテンツソケット= new Socket(ServerAddr、ポート)を取得します。 //サーバーに文字要求を送信して、ファイルprintwriter out1 = new BufferedWriter(new outputStreamWriter(socket.getOutputStream()))、true)を取得します。 out1.println( "ok"+s); out1.flush(); out.close(); //入力ストリームBufferedInputStream bis = new BufferedInputStream(socket.getInputStream())を定義します。文字列file1 = filename;文字列ファイル; // sdcardが電話に挿入されているかどうかを判断するには、ファイルをメモリカードに挿入します(環境.getexternalstoragestate()。 // SDカード定義ファイル= sdcard.getCanonicalFile() + "/" + file1; //ファイル出力ストリームfileoutputStream fos = new fileoutputStream(file、true); {int t = -1; int downloaded = pre; //送信バイトあたりのバイト数を定義します[] buff = new byte [8192]; log.i( "sum"、sum + ""); //サーバーファイルの書き込みを携帯電話SDカードに書き始めます((t = bis.read(buff))!= -1){if(isStop == true){break; } fos.write(buff、0、t);ダウンロード += t; //送信Progress Editor.putint( "DownService"、ダウンロード)を保存します。 editor.commit(); //送信が完了したら、保存された情報をリセットします(ダウンロード== sum){editor.putint( "downService"、0); editor.commit(); } //ファイル転送フロートの進行状況を取得wb =((ダウンロード * 100) /(float)sum); int wi =(int)wb; System.out.println(ダウンロード); string str = string.valueof(wi) + "%"; //ファイル転送の進行状況をベース反応性に送信して、ユーザーメッセージに表示msg = new Message(); //メッセージを生成する//メッセージmsg.what = 0x0001; //メッセージタイプの設定data.putstring( "value"、str); msg.setdata(data); //ハンドラーを使用してメッセージmainactivity.myhandler.sendmessage(msg)を送信します。 } //入力と出力ストリームを閉じますbis.close(); fos.flush(); fos.close(); } catch(例外e){bis.close(); fos.flush(); fos.close(); }} log.d(tag、 "from server: 'receive" + "'"); } catch(unknownhostexception e){log.e(tag、 "192.168.155.1はuncle server!"); } catch(Exception e){e.printstacktrace(); }最後に{try {socket.close(); } catch(Exception e){e.printstacktrace(); }}}}}}; workthread = newスレッド(バックグラウンドワーク); // isaliveメソッドは、workthreadスレッドがオンになっているかどうかを判断するために使用されます。 log.v( "servicelife"、 "スレッドが動作を開始"); } else {log.v( "workthread"、 "スレッドが呼び出されました"); } return start_sticky; } @Override public void ondestroy(){super.ondestroy(); //割り込みを使用してスレッドを割り込むisStop = true; log.v( "servicelife"、 "ondestroyメソッドが呼び出されます"); }} 5.最後に、AndroidManifest.xmlを登録することを忘れないでください
<uses-permission android:name = "android.permiss.internet"/> <ueses-permission android:name = "android.permiss.mount_unmount_filesystems"> </uses-permiss> <ueses-permission android:name = "android.permission.write_external_storage"> < Android:name = "。downservice"> </service>
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。