Die Beispiele in diesem Artikel teilen Ihnen den Prozess von Java mit Socket, um einen Downloader und einen verwandten Code für Ihre Referenz zu erstellen. Der spezifische Inhalt ist wie folgt
1. Erstellen Sie zunächst einen Server, um Informationen zu verarbeiten und Dateien auf den Client (Computer) zu übertragen.
Ich schaltete ein WLAN mit meinem Computer ein und schloss sich dann mit dem Telefon an und benutzte einen SCOKET, um es zu übertragen.
Serverip sollte entsprechend Ihrer tatsächlichen Situation geändert werden. Der Port kann auch nach Belieben geändert werden.
Import Java.io.BufferedInputStream; Import Java.io.BuffenedOutputStream; Import Java.io.BufferedReader; Import Java.io.BufferedReader; Import Java.io.BuffenedWriter; Import Java.io.file; java.io.printwriter; import java.net.serversocket; import Java.net.socket;/** * Testen Sie den Android -Client und den PC -Server interagieren über Socket Server -Seite: Clientinformationen empfangen und senden Sie sie an den Client zurück * * @Author Ameyte */öffentliche Klassen -Server. "192.168.155.1"; // Definieren Sie den 9888 Port Public Static Final Int Serverport = 9888; // Definieren Sie die Datei private Datei Datei = null; public static void main (String [] args) {// Erstellen Sie die Methode zum Aufrufen von Thread, um Getriebe Thread Desktopserverthread = neuer Thread (neuer Server ()) auszuführen; Desktopserverthread.Start (); } public void run () {try {system.out.println ("s: connecting ... 9888"); // Socket ServerSocket ServerSocket = New ServerSocket (Serverport) erstellen; while (true) {// Warte auf die Annahme von Client fordert Socket client = serverSocket.accept (); System.out.println ("S: Empfangen ... 9888"); Versuchen Sie {// Client -Informationen BufferedReader in = new bufferedReader (neuer InputStreamReader (client.getInputStream ())); System.out.println ("s: Clientinformationen empfangen"); // Client Information String String str = in.readline (); String str1 = str.substring (0,2); String str2 = str.substring (2); System.out.println (str); // Die entsprechende Datei gemäß der Anfrage des Clients ermitteln und den Wert der Dateigröße übergeben if (str.equals ("file_size") {// Definieren Sie die Datei, die Sie übertragen möchten (ich habe eine Datei unter e disk hier geschrieben) Datei = neue Datei ("e: // eine Datei"); // Stream -FileInputStream fis = new FileInputStream (Datei); // Ausgabe von Stream BufferedInputStream Bis = neuer BufferedInputStream (FIS); // Berechnen Sie die Dateigröße, die übertragen werden soll. // Die Dateigröße des Int -Typs in eine Zeichenfolge Zeichenfolge s = string.Valueof (sum) konvertieren; System.out.println (s); // Erstellen Sie den Ausgabestream, um Dateigrößeninformationen zu senden. Printwriter out = new printwriter (neuer bufferedwriter (neuer outputStreamwriter (client.getOutputStream ()), true); // Dateigrößeninformationen senden.println (s); // stream out.flush () schließen; Bis.close (); } else if (str1.equals ("ok")) {int a = integer.parseInt (str2); // Nachdem der Client den Dateigrößenwert erhalten hat, wird die Datei gemäß dem vom Client BufferedOutputStream Bos = New BufferedOutputStream gesendeten "OK" übergeben. System.out.println ("S: Start Transfer"); // Übertragung starten if (true) {// Stream -FileInputStream fis = new FileInputStream (Datei); // Überspringen Sie die Bytes, die vor Fis.skip (a) übertragen wurden; // Puffer -Eingangsstrom BufferedInputStream Bis = New BufferedInputStream (FIS); int t = -1; while ((t = Bis.read ())> = 0) {bos.write (t); } String s = "übertragen"; // Stream bos.flush () schließen; Bis.close (); bos.close (); // serversocket.close (); System.out.println ("s: empfangen: '" + S + "'"); }} else {System.out .println ("Nicht Empfänger von Client!"); }} catch (Ausnahme e) {System.out.println ("S: Fehler 1"); E. printstacktrace (); } endlich {client.close (); System.out.println ("S: Done."); }}} catch (Ausnahme E) {System.out.println ("S: Fehler 2"); E. printstacktrace (); }}} 2. Erstellen Sie einen anderen Kunden, ich benutze MainActivity.java in Android geschrieben (ich führe ihn auf meinem Telefon aus)
Paket com.xhy.zz; import Android.app.Activity; import android.content.intent; import android.os.bundle; import android.os.handler; import android.os.message; import android.view.view.view; import.view.view.onclicklistener; android.widget.button; Android.widget.textView; MainActivity der öffentlichen Klasse erweitert die Aktivität {// Definieren von Handler Public Static Handler MyHandler; // Absicht der privaten Absicht definieren; // Erhalten Sie den Steuerelement private TextView text_name; private textView text_percent; private Button btn_start; private Button btn_stop; // Datei anzeigen private textView text_sel_file; @Override Protected void OnCreate (Bündel savedInstancestate) {// Todo Auto-generierte Methode 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); // Informationen von Button One zurückgeben, und den Fortschritt myHandler = new Handler () {@Override public void Handlemessage (Message MSG) {Super.HandLemessage (MSG); if (msg.what == 0x0001) {Bundle data = msg.getData (); String str = data.getString ("Wert"); text_percent.setText (str); }}}}; // nennen Sie explizit HelloService Intent = New Intent (this, DownService.class); // Setzen Sie die Startschaltfläche Klicken Sie auf Ereignis btn_start.setonClickListener (neuer OnclickListener () {@Override public void onclick (Ansicht v) {// Start des Dienstes startservice (Intent);}}); // Setzen Sie die Button -Schaltfläche Klicken Sie auf Ereignis btn_stop.setonclickListener (neuer OnclickListener () {@Override public void onclick (Ansicht v) {// den Service Stopservice (Intent);}}); } / ****Die Rückrufmethode wird vom System automatisch aufgerufen, sobald der Rückgabewert zurückgegeben wird // Wenn der Anforderungscode 0 // ist und der zurückgegebene Ergebniscode 1 // ist, kann die angeforderte Aktivität mehrere Ergebniscodes zurückgeben, wenn (RequestCode == 0 && resultCode == 1) {// Die Data bündeldaten = intent.getExtras () herausnehmen; String str = data.getString ("Dateien"); // Data text_sel_file.setText (str) anzeigen; }}} 3.. Activity_main.xml Datei
<?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:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:orientation="horizontal" > <TextView android:id="@+id/text_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 = "20dp" Android: text = "0%"/> <linearlayout Android: layout_width = "Wrap_Content" Android: Layout_Height = "Wrap_content" und orientiert "und Layout: Layout: Layout: Layout: Layout: Layout: Layout: Layout: Layout: Layout: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT: LAYOUT:" <Button Android: id = "@+id/btn_start" Android: layout_width = "Wrap_Content" Android: layout_Height = "Wrap_Content" Android: text = "start"/> <button android: id = "@+id/btn_stop" android: layout_width = "Wrack_content" " Android: layout_Height = "Wrap_Content" Android: text = "Stop"/> </linearlayout> </linearlayout> </linearlayout> </linearlayout>
4. Downservice wird verwendet, um Threads zu ermöglichen, Downloads im Hintergrund auszuführen
Paket com.xhy.zz; import Java.io.BufufferedInputStream; Import Java.io.BufferedReader; Import Java.io.BuffeedReader; Import Java.io.BuffenedWriter; import Java.io.IO.IO.FILE; java.io.printwriter; import Java.net.inetaddress; import Java.net.socket; import Java.net.unnownhostException; importieren Android.app.Service; android.os.environment; import Android.os.ibinder; import Android.os.message; import Android.util. // Dateiname des Präferenzmechanismus Operation öffentliche statische endgültige String -String -Präferenz_Name = "DownService"; // Betriebsmodus des bevorzugten Mechanismus Public static int modus = context.mode_private; // Thread Private Thread -Workthread; // Definieren Sie den Dateinamen private String Dateiname = "Datei"; // Portnummer private int port = 9888; privat boolean isSstop = false; / ****Methoden, die implementiert werden müssen } @Override public void onCreate () {Super.oncreate (); } @Override public int onStartCommand (Absicht, int Flags, int startid) {log.v ("TCP", Dateiname); // Übertragungsmethode Runnable Hintergrundwork = new Runnable () {@Override public void run () {// settitle ("Test -Socket -Verbindung"); Socket Socket = Null; Socket Socket1 = NULL; Versuchen Sie { / * * Geben Sie die IP -Adresse des Servers an, diese Adresse ist die LAN -Adresse. Wenn Sie WLAN zum Surfen des Internets verwenden, ist es die WLAN-IP-Adresse des PC * Die IP-Adresse, die Sie in IPConfig angezeigt haben, lautet wie folgt: Ethernet-Adapter-drahtloser Netzwerkverbindung: * Verbindungsspezifisches DNS-Suffix. : IP -Adresse. . . *. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verwenden Sie die IP und den Port des Servers, um ein Socket -Objekt zu erstellen, und senden Sie eine Anforderung an den Server, um den Dateigröße Value Socket1 = neuer Socket (Serveraddr, Port) zu erhalten. String message = "--- test_socket_android ---"; Log.d ("TCP", "C: Senden: '" + message + "'"); // Senden Sie die Informationen über diesen Objekt -Pressewriter out = neuer Pressewriter (neuer Bufferer (neuer Ausgangsstreamwriter (Socket1.GetOutputStream ()), True); // Senden Sie den vom Benutzer eingegebenen Inhalt an den Server out.println ("file_size"); out.flush (); // Serverinformationen BufferedReader in = new bufferedReader (neuer InputStreamReader (Socket1.GetInputStream ())) erhalten; // Dateigröße string str1 = in.readline (); Log.d ("tcp", str1); // Die Dateigröße in int-Typ int sum = integer.parseInt (str1) konvertieren; Log.d ("tcp", str1); // Eingabestrom in.close () schließen; SharedPreferences SharedPreferences = getSharedPreferences (Präferenzname, Modus); SharedPreferences.Editor Editor = SharedPreferences .Edit (); // Die übertragenen Bytes in int pre = SharedPreferences.getint ("Downservice", 0) abrufen; int _pre = pre; // es in eine Zeichenfolge konvertieren, um an die Server -Zeichenfolge s = string.Valueof (_pre) zu senden; // Verwenden Sie die IP und den Port des Servers, um ein Socket -Objekt festzulegen und eine Anforderung erneut an den Server zu senden, um den Dateiinhalts -Socket = New Socket (ServeradDR, Port) zu erhalten. // die Zeichenanforderung an den Server senden, um den Dateiprintwriter out1 = neuer Pressewriter (New BufferedWriter (New OutputStreamWriter (Socket.GetOutputStream ()), True) zu erhalten; out1.println ("ok"+s); out1.flush (); out.close (); // Definieren Sie den Eingangsstrom BufferedInputStream Bis = New BufferedInputStream (socket.getInputStream ()); String -Datei1 = Dateiname; String -Datei; // Bestimmen Sie, ob die SDCard in das Telefon eingefügt wird. Fügen Sie die Datei in die Speicherkarte ein, wenn (umgebnis.getExternalStorAGestate (). Equals (Umgebung.Media_Mounted)) {Datei SDCard = Umgebung .GetexternalStoragedirectory (); // SD -Kartendefinitionsdatei = sdcard.getCanonicalFile () + "/" + Datei1; // Dateiausgabemittel Stream FileOutputStream fos = new FileOutputStream (Datei, true) definieren; Versuchen Sie {int t = -1; int heruntergeladen = pre; // Definieren Sie die Anzahl der Bytes pro Getriebe Byte [] Buff = New Byte [8192]; Log.i ("sum", sum + ""); // Schreiben Sie die Serverdatei an die Mobiltelefon -SD -Karte, wobei ((t = Bis.Read (Buff))! } fos.write (Buff, 0, t); heruntergeladen += t; // Speichern Sie den Editor für den Übertragungsprogress. Putint ("Downservice", heruntergeladen); editor.commit (); // Wenn die Übertragung abgeschlossen ist, setzen Sie die gespeicherten Informationen zurück, wenn (heruntergeladen == sum) {editor.putint ("DownService", 0); editor.commit (); } // den Fortschritt der Dateitransfer float wb = ((heruntergeladen * 100) / (float) sum); int wi = (int) wb; System.out.println (heruntergeladen); String str = string.Valueof (WI) + "%"; // Senden Sie den Fortschritt der Dateiübertragung an die Basisaktivität, um die Benutzernachricht msg = new message () anzuzeigen. // Nachricht generieren // Nachrichten msg.what = 0x0001 erzeugen; // Nachrichtentyp festlegen // Bundle -Traging -Datenbündel data = new bündel (); Data.putstring ("Wert", str); msg.setData (Daten); // Verwenden Sie Handler, um Nachrichten MainActivity.myhandler.SendMessage (MSG) zu senden. } // Schließen Sie den Eingangs- und Ausgangsstrom bis.close (); fos.flush (); fos.close (); } catch (Ausnahme e) {Bis.close (); fos.flush (); fos.close (); }} Log.d (Tag, "von Server: 'empfangen" + "'"); } catch (unbekannteHostException e) {log.e (tag, "192.168.155.1 ist Onkel Server!"); } catch (Ausnahme e) {e.printstacktrace (); } endlich {try {socket.close (); } catch (Ausnahme e) {e.printstacktrace (); }}}}}}; Workthread = neuer Thread (Hintergrund); // ISALIVE -Methode wird verwendet, um festzustellen, ob der WorkThread -Thread eingeschaltet ist, wenn (! Workthread.isalive ()) {// einen neuen Thread -Workthread.start () generieren; Log.v ("servicelife", "Thread beginnt zu funktionieren"); } else {log.v ("WorkThread", "Thread wurde genannt"); } return start_sticky; } @Override public void onDestroy () {Super.onDestroy (); // den Thread mit Interrupt isStop = true unterbrechen; Log.v ("servicelife", "OnDestroy -Methode heißt"); }} 5. Vergessen Sie nicht, AndroidManifest.xml zu registrieren
<Nutzungsvermittlung Android: name = "Android.Permission.internet"/> <Nutzungsdauer Android: name = "Android.Permission.mount_unmount_filesystems"> </used-permission> <usad-Permission Android: name = "android.Wermission.Write_External_Storage"> </usws-postormission. > </service>
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.