Los ejemplos en este artículo comparten con usted el proceso de Java usando Socket para crear un descargador y un código relacionado para su referencia. El contenido específico es el siguiente
1. Primero, establezca un servidor para procesar información y transferir archivos al cliente (computadora)
Encendí un wifi usando mi computadora, y luego me conecté al teléfono y usé un scoket para transmitirlo.
ServerIP debe cambiarse de acuerdo con su situación real. El puerto también se puede cambiar a voluntad 0 ~ 65535, intente elegir uno más grande
import 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.fileinputputstreamReader; importar java. java.io.printwriter; import java.net.serversocket; import java.net.socket;/** * Pruebe el cliente de Android y el servidor de PC interactúen a través del lado del servidor Socket: reciba información del cliente y envíela nuevamente al cliente * * @author Ameyume * */Public Class Servidor implementaciones ejecutables {// Definir la IP y la información de la transmisión para transmisionar la transmisión estatica final final de la cadena final final de la cadena final final de la cadena final. // Definir el puerto 9888 public static final int serverport = 9888; // Definir el archivo de archivo privado archivo = null; public static void main (string [] args) {// Cree el método para llamar a hilo para realizar la transmisión hilo DesktoPServerThread = new Thread (nuevo servidor ()); DesktopServerThread.Start (); } public void run () {try {System.out.println ("S: Connecting ... 9888"); // Crear Socket Serversocket Serversocket = nuevo Serversocket (ServerPort); while (true) {// Espere para aceptar las solicitudes del cliente Socket Client = Serversocket.accept (); System.out.println ("S: Recibir ... 9888"); Pruebe {// Acepte la información del cliente BufferedReader en = new BufferedReader (new InputStreamReader (Client.getInputStream ())); System.out.println ("S: recibir información del cliente"); // Leer información del cliente Str = in.readline (); Cadena str1 = str.substring (0,2); Cadena str2 = str.substring (2); System.out.println (str); // Encuentre el archivo correspondiente de acuerdo con la solicitud del cliente y pase el valor del tamaño del archivo sobre if (str.equals ("file_size")) {// Defina el archivo que desea transferir (escribí un archivo en E disco aquí) archivo = nuevo archivo ("e: // un archivo"); // Ingrese Stream FileInputStream FIS = new FileInputStream (archivo); // STORK de salida BufferedInputStream BIS = new BufferedInputStream (FIS); // Calcule el tamaño del archivo a transferir int sum = bis.available (); // Convierta el tamaño de archivo del tipo int en una cadena de cadena S = String.ValueOf (suma); System.out.println (s); // Crear la transmisión de salida para enviar información del tamaño del archivo PrintWriter Out = New PrintWriter (new BufferedWriter (new OutputStreamWriter (Client.getOutputStream ())), true); // Enviar información sobre el tamaño del archivo. // cerrar stream out.flush (); bis.close (); } else if (str1.equals ("ok")) {int a = integer.parseInt (str2); // Después de que el cliente recibe el valor del tamaño del archivo, pasa el archivo de acuerdo con el "OK" enviado por el cliente BufferedOutputStream Bos = new BufferedOutputStream (Client.getOutputStream ()); System.out.println ("S: Start Transfer"); // Iniciar transferencia if (true) {// Ingrese Stream FileInputStream FIS = new FileInputStream (archivo); // omita los bytes que se han transferido antes de fis.skip (a); // flujo de entrada de búfer bufferedinputStream bis = new BufferedInputStream (FIS); int t = -1; while ((t = bis.read ())> = 0) {bos.write (t); } Cadena S = "transmitido"; // Cerrar Stream Bos.Flush (); bis.close (); bos.close (); // Serversocket.close (); System.out.println ("S: Recibido: '" + S + "'"); }} else {System.out .println ("¡No receptor nada del cliente!"); }} catch (Exception e) {System.out.println ("S: Error 1"); E.PrintStackTrace (); } Finalmente {client.close (); System.out.println ("s: hecho"); }}} catch (Exception e) {System.out.println ("S: Error 2"); E.PrintStackTrace (); }}} 2. Cree otro cliente, uso MainActivity.java escrito en Android (lo ejecuto en mi teléfono)
paquete 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; import android.view.view.onclickListener; import android.widget.button; {// Definir el manejador público Myhandler MyHandler; // Definir intención intención privada intención; // Obtener el control de textView privado text_name; TextView privado text_percent; botón privado btn_start; botón privado btn_stop; // File visualización de textview privado text_sel_file; @Override protegido void onCreate (Bundle SaveDInStancestate) {// TODO Método Generado automático 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 = (botón) findViewByid (r.id.btn_start); btn_stop = (botón) findViewByid (r.id.btn_stop); // Devuelve la información del botón uno, mostrando Progress myHandler = new Handler () {@Override public Void HandLemessage (Mensaje Msg) {super.handlemessage (msg); if (msg.what == 0x0001) {Bundle data = msg.getData (); Cadena str = data.getString ("valor"); text_percent.settext (str); }}}}; // insertar intención de helloService = nueva intención (this, downservice.class); // Establezca el botón de inicio en el evento BTN_START.SetOnClickListener (new onClickListener () {@Override public void onClick (Ver v) {// Iniciar el servicio StartService (intento);}}); // Establezca el evento del botón Stop Botton btn_stop.setOnClickListener (new onClickListener () {@Override public void onClick (Ver V) {// Cerrar el servicio de servicio (intención);}}); } / ****El método de devolución de llamada será llamado automáticamente por el sistema una vez que el valor de retorno se devuelve* / @Override void onactivityResult (int requestCode, int resultCode, intencion intent) {super.onactivityResult (requestCode, resultCode, intent); // Si el código de solicitud es 0 // y el código de resultado devuelto es 1 // la actividad solicitada puede devolver múltiples códigos de resultados if (requestCode == 0 && resultCode == 1) {// Saque el paquete de datos data = intent.getExtras (); Cadena str = data.getString ("archivos"); // Mostrar datos text_sel_file.settext (str); }}} 3. Activity_main.xml archivo
<? xml versión = "1.0" encoding = "utf-8"?> <linealLayout xmlns: android = "http://schemas.android.com/apk/res/android" android: layout_width = "PARENT" android: Layout_height = "Match_Parent" android: Layout_height = "Match_parent" Android: orientation = "vertical"> <lineAleLayout android: light_width = "wrap_content" Android: Layout_height = "wrap_content" Android: Layout_margintop = "20dp" Android: orientación = "horizontal"> <TextView android: id = "@+id/text_name" android "android" android "android" 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" ANDOID: LEXOUT_CENTICAL = "" ECTUARIICA " Android: Layout_marginleft = "20DP" Android: text = "0%"/> <lineArLayout android: LEXOUT_WIDTH = "wrap_content" android: Layout_height = "wrap_content" android: layout_marginleft = "20dp" android: orientación = "verticical"> <botte y button: "@+"@+"@+"@+"@+st"@+thn " android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="start" /> <Button android:id="@+id/btn_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="stop" /> </LinearLayout> </LinealLayout> </lineAleLayout> </LinearLayout>
4.DownService se usa para habilitar los hilos para ejecutar descargas en segundo plano
paquete com.xhy.zz; import java.io.bufferedInputStream; import java.io.bufferedReader; import java.io.bufferedReader; import java.io.bufferedwriter; import java.io.file; import java.io.fileOutputStream; import java.io.inputStreamStreamStreamStreamStream 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.content; import android.content.sharedingpreferences; android.os.environment; import android.os.ibinder; import android.os.message; import android.util.log; public class Downservice extiende el servicio {String final estática privada Tag = "Socket_android"; // Nombre de archivo de la operación del mecanismo de preferencia Public static final String preference_name = "Downservice"; // Modo de operación del mecanismo preferido público static int mode = context.mode_private; // Thread PRIVADO THROWTHING de trabajo; // Definir el nombre de archivo Private String filename = "archivo"; // Número de puerto Private Int Port = 9888; booleano privado isstop = false; / ****Métodos que deben implementarse*/ @Override public Ibinder onbind (intención intención) {return null; } @Override public void onCreate () {super.oncreate (); } @Override public int OnStartCommand (Intent intent, int flags, int startid) {log.v ("tcp", nombre de archivo); // Crear método de transmisión Runnable BackgroundWork = new runnable () {@Override public void run () {// settitle ("Test Socket Conexión"); Socket de socket = nulo; Socket Socket1 = NULL; Pruebe { / * * Especifique la dirección IP del servidor, esta dirección es la dirección LAN. Si está utilizando WiFi para navegar por Internet, es la dirección IP Wifi de la PC * La dirección IP que vio en IPCONFIG es la siguiente: Conexión de red inalámbrica del adaptador Ethernet: * Sufijo DNS específico de la conexión. : Dirección IP. . . *. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Use la IP y el puerto del servidor para crear un objeto Socket y enviar una solicitud al servidor para obtener el valor del tamaño del archivo Socket1 = new Socket (ServerAddr, puerto); String Message = "--- test_socket_android ---"; Log.d ("tcp", "c: envío: '" + mensaje + "'"); // Envía la información al servidor a través de este objeto PrintWriter out = New PrintWriter (new BufferedWriter (nuevo OutputStreamWriter (Socket1.getOutputStream ())), verdadero); // Enviar el contenido ingresado por el usuario al servidor out.println ("file_size"); out.flush (); // Recibir información del servidor BufferedReader in = new BufferedReader (new InputStreamReader (Socket1.getInputStream ())); // Obtener el tamaño del archivo Str1 = in.readline (); Log.d ("tcp", str1); // Convertir el tamaño del archivo a int-type int sum = integer.parseInt (str1); Log.d ("tcp", str1); // cierre la transmisión de entrada en.close (); SharedPreferences SharedPreferences = getSharedPreferences (preference_name, modo); SharedPreferences.Editor Editor = SharedPreferences .Edit (); // Obtenga los bytes transmitidos int pre = SharedPreferences.getInt ("Downservice", 0); int _pre = pre; // Conviertalo en una cadena para enviar a la cadena del servidor S = String.ValueOf (_Pre); // Use la IP y el puerto del servidor para establecer un objeto Socket y enviar una solicitud al servidor nuevamente para obtener el contenido del archivo Socket = new Socket (ServerAddr, puerto); // Envía la solicitud de caracteres al servidor para obtener el archivo printWriter out1 = new PrintWriter (new BufferedWriter (nuevo OutputStreamWriter (Socket.getOutputStream ())), verdadero); out1.println ("ok"+s); out1.flush (); out.close (); // Defina la corriente de entrada BufferedInputStream BIS = new BufferedInputStream (Socket.getInputStream ()); Cadena archivo1 = nombre de archivo; Archivo de cadena; // Determine si la tarjeta SD se inserta en el teléfono, inserte el archivo en la tarjeta de memoria if (entorno.getExternalStoraGestate (). Equals (ambiente.media_mounted)) {archivo sdcard = entorno .getExternalStoreGelEdirectory (); // archivo de definición de tarjeta SD Archivo = sdcard.getCanonicalFile () + "/" + file1; // Definir el archivo de salida de archivo FileOutputStream fos = new FileOutputStream (archivo, true); intente {int t = -1; int descargado = pre; // Definir el número de bytes por byte de transmisión [] buff = new Byte [8192]; Log.i ("suma", sum + ""); // Comience a escribir el archivo del servidor en la tarjeta SD del teléfono móvil mientras ((t = bis.read (buff))! = -1) {if (isstop == true) {break; } fos.write (buff, 0, t); descargado += t; // almacenar el progreso de la transmisión editor.putint ("Downservice", descargado); editor.commit (); // Cuando se complete la transmisión, restablezca la información almacenada si (descargada == suma) {editor.putInt ("Downservice", 0); editor.commit (); } // Obtener el progreso de la transferencia de archivos float wb = ((descargado * 100) / (flotante) suma); int wi = (int) wb; System.out.println (descargado); Cadena str = string.ValueOf (wi) + "%"; // Envía el progreso de transferencia de archivos a la base de basura para mostrar al mensaje del usuario msg = new Message (); // Generar mensajes // Generar mensajes msg.what = 0x0001; // Establecer el tipo de mensaje // Generar datos de datos de paquete de datos = new Bundle (); data.putString ("valor", str); msg.setData (datos); // Use el controlador para enviar mensajes MainActivity.myhandler.sendMessage (MSG); } // Cerrar la transmisión y la transmisión de salida bis.close (); fos.flush (); fos.close (); } capt (excepción e) {bis.close (); fos.flush (); fos.close (); }} Log.d (etiqueta, "del servidor: 'recibido" + "'"); } Catch (desconocidoHosTexception e) {log.e (etiqueta, "192.168.155.1 es un servidor de tío!"); } catch (Exception e) {E.PrintStackTrace (); } finalmente {try {Socket.close (); } catch (Exception e) {E.PrintStackTrace (); }}}}}}; WorkThread = new Thread (Funcionarwork); // El método isalive se usa para determinar si el hilo de trabajo de trabajo está activado si (! workthread.isalive ()) {// Generar un nuevo hilo Workthread.start (); LOG.V ("ServiceLife", "El hilo comienza a funcionar"); } else {log.v ("WorkThread", "se ha llamado el hilo"); } return start_sticky; } @Override public void onDestrOY () {super.onstroy (); // interrumpir el hilo usando Interrupt IsStop = True; Log.v ("ServiceLife", "se llama al método de inyestro"); }} 5. Finalmente, no olvides registrar androidmanifest.xml
<usos-permission android: name = "android.permission.internet"/> <use-permission android: name = "android.permission.mount_unmount_filesystems"> </suse-permission> <useds-permission android: name = "android.permission.write_external_storage"> </suse-permission> <serveides > </serving>
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.