Os exemplos deste artigo compartilham com você o processo de Java usando soquete para criar um downloader e um código relacionado para sua referência. O conteúdo específico é o seguinte
1. Primeiro, estabeleça um servidor para processar informações e transferir arquivos para o cliente (computador)
Liguei um wifi usando meu computador e depois conectei ao telefone e usei um scoket para transmiti -lo.
O Serverip deve ser alterado de acordo com sua situação real. A porta também pode ser alterada na vontade 0 ~ 65535, tente escolher um maior
importar java.io.bufferedInputStream; importar java.io.bufferedOutputStream; importar java.io.bufferedReader; importar java.io.bufferedReader; import java.io.bufferStreaderReader; import java.io.file; import java.io.fileIrtSreaderReader; java.io.printWriter; importar java.net.serversocket; importar java.net.socket;/** * Teste o cliente Android e o servidor PC interagem através do lado do servidor de soquete: receba informações do cliente e envie -as de volta ao cliente * * * @author Ameyume */public class Server Iplemmenta Runnable {/ // "192.168.155.1"; // Defina o 9888 Public Public Static Final Int Serverport = 9888; // Defina o arquivo de arquivo privado arquivo = null; public static void main (string [] args) {// Crie o método para chamar o thread para executar o encadeamento de transmissão desktopserverthread = new Thread (new server ()); desktopserverthread.start (); } public void run () {try {System.out.println ("s: conectando ... 9888"); // Crie Socket ServerSocket ServerSocket = new ServerSocket (Serverport); while (true) {// Aguarde para aceitar o Setor de solicitações do cliente cliente = serversocket.accept (); System.out.println ("s: recebendo ... 9888"); tente {// Aceite informações do cliente BufferReader em = new BufferredReader (new InputStreamReader (client.getInputStream ())); System.out.println ("s: receber informações do cliente"); // leia informações do cliente string str = in.readline (); String str1 = str.substring (0,2); String str2 = str.substring (2); System.out.println (str); // Encontre o arquivo correspondente de acordo com a solicitação do cliente e passe o valor do tamanho do arquivo se (str.equals ("file_size")) {// Defina o arquivo que você deseja transferir (escrevi um arquivo em e disco aqui) file = novo arquivo ("e: // um arquivo"); // Entrada Stream fileInputStream fis = new FileInputStream (arquivo); // saída de fluxo de saída bufferInputStream bis = new bufferInputStream (fis); // calcule o tamanho do arquivo a ser transferido int sum = bis.Available (); // converte o tamanho do arquivo do tipo int em uma string s = string.valueof (soma); System.out.println (s); // Crie o fluxo de saída para enviar informações de tamanho de arquivo PrintWriter Out = new PrintWriter (new BufferWriter (novo outputStreamWriter (client.getOutputStream ())), true); // Envie informações de tamanho de arquivo para fora.println (s); // Fechar o fluxo fora.flush (); bis.close (); } else if (str1.equals ("ok")) {int a = Integer.parseint (str2); // Depois que o cliente recebe o valor do tamanho do arquivo, ele passa o arquivo de acordo com o "OK" enviado pelo cliente bufferoutputStream bos = new BufferoudOutputStream (client.getOuttutStream ()); System.out.println ("s: start transfer"); // Inicie a transferência if (true) {// Entrada FreeNputEnputStream fis = new FileInputStream (FILE); // pule os bytes que foram transferidos antes do fis.skip (a); // buffer de entrada de fluxo bufferinputStream bis = new bufferingInputStream (fis); int t = -1; while ((t = bis.read ())> = 0) {bos.write (t); } String s = "transmitido"; // FORNECIMENTO BOS.FLUSH (); bis.close (); bos.close (); // serversocket.close (); System.out.println ("s: recebido: '" + s + "'"); }} else {System.out .println ("Não receptor nada do cliente!"); }} catch (Exceção e) {System.out.println ("S: Erro 1"); E.PrintStackTrace (); } finalmente {client.close (); System.out.println ("s: feito."); }}} catch (Exceção e) {System.out.println ("S: Erro 2"); E.PrintStackTrace (); }}} 2. Crie outro cliente, eu uso MainActivity.java escrito no Android (eu o corro no meu telefone)
pacote com.xhy.zz; importar Android.App.Activity; importar Android.content.intent; importar Android.os.bundle; importar Android.os.Handler; import Android.os.message; import Android.View; MainActivity estende a atividade {// Definir manipulador estático de manipulador MyHandler; // define intenção intenção intenção privada intenção; // Obtenha o controle Private TextView text_name; TextView privado Text_Percent; botão privado btn_start; botão privado btn_stop; // Exibir arquivo Exibir textView privado text_sel_file; @Override Protected void onCreate (pacote savedInstanceState) {// TODO Método Auto-Gerado 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ão) findViewById (r.id.btn_start); btn_stop = (botão) findViewById (r.id.btn_stop); // retorna informações do botão um, exibindo progresso myHandler = new Handler () {@Override public void handleMessage (mensagem msg) {super.handleMessage (msg); if (msg.what == 0x0001) {pacote dados = msg.getData (); String str = data.getString ("value"); text_percent.settext (str); }}}}; // De uma maneira explícita, ligue para Helloservice Intent = New Intent (isto, downService.class); // Defina o botão Iniciar Clique em Evento BTN_START.setOnClickListener (new OnClickListener () {@Override public void OnClick (View V) {// Inicie o Serviço StartService (intenção);}}); // Defina o botão de parada Clique em Event btn_stop.setOnClickListener (new OnClickListener () {@Override public void OnClick (View V) {// Feche o serviço StopService (intenção);}}); } / ****O método de retorno de chamada será chamado automaticamente pelo sistema assim que o valor de retorno for retornado* / @Override Protected void onactivityResult (int requestcode, int resultadocode, intenção intenção) {super.onactivityResult (requestcode, resultadocode, intenção); // Se o código da solicitação for 0 // e o código de resultado retornado for 1 // A atividade solicitada poderá retornar vários códigos de resultado se (requestcode == 0 && resultCode == 1) {// retire os dados de dados = Intent.GetexTras (); String str = data.getString ("arquivos"); // mostra dados text_sel_file.settext (str); }}} 3. Atividade_main.xml Arquivo
<? xml versão = "1.0" coding = "utf-8"?> <linearlayout xmlns: Android = "http://schemas.android.com/apk/res/android" Android: layout_width = "match_parent" andro: layout_height_height = " Android: Orientation = "Vertical"> <LinearLayout Android: layout_width = "wrap_content" Android: layout_height = "wrap_content" Android: Layout_Margintop = "20dp" Android: Orientation = "Horizontal"> <TextRoid = Android: Idroid: Idroid: "Android =" Horizontal "> <TextROIDROID: 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_widthth = 50p = ""@+id /text) Android: layout_gravity = "Center_vertical" Android: layout_marginleft = "20dp" Android: text = "0%"/> <linearLayout Android: layout_width = "wrap_content" Android: Orientation = "Vertical"> <Button Android: id = "@+id/btn_start" Android: layout_width = "wrap_content" Android: layout_height = "wrap_content" Android: Text = "Start"/> <Button Android: id = "@"+/bt " Android: layout_width = "wrap_content" Android: layout_height = "wrap_content" Android: text = "Stop"/> </leinearLayout> </linearLayout> </leinearlayout> <linearLayout>
4.Downservice é usado para permitir que os threads executem downloads em segundo plano
pacote com.xhy.zz; importar java.io.bufferedInputStream; importar java.io.bufferedReader; importar java.io.bufferedreader; importar java.io.bufferWriter; import java.io.io.file; import java.io.fileoutStream; import java.io.io.io.file; importar java.io.fileoutStream; import java.io.io.io.file; java.io.printwriter; importar java.net.inetaddress; importar java.net.socket; importar java.net.unknownhostexception; importação Android.App.ervice; importBrOid.content.Context; Import.MerSoReed.Imerhererhererhor.TerHoRoD.Content.Context; IMMORROID.CONTENT.ITBORTENT; Android.os.Environment; importar Android.OS.Ibinder; importar Android.OS.Message; importar Android.util.log; classe pública OffService estende o serviço {private Static final String tag = "Socket_android"; // Nome do arquivo da operação de mecanismo de preferência public static final string preference_name = "donService"; // Modo de operação do mecanismo preferece public static int mode = context.mode_private; // Thread Private Thread Workthread; // define o nome do arquivo private string filename = "arquivo"; // Porta número private int porta = 9888; private boolean isStop = false; / ****Métodos que devem ser implementados*/ @Override public ibinder onBind (intenção intenção) {return null; } @Override public void onCreate () {super.oCreate (); } @Override public int OnStartCommand (intenção intenção, int sinalizadores, int startId) {log.v ("tcp", nome do arquivo); // Crie método de transmissão Runnable Backgroundwork = new Runnable () {@Override public void run () {// Settitle ("Test Socket Connection"); Soquete soquete = nulo; Socket Socket1 = NULL; tente { / * * especifique o endereço IP do servidor, este endereço é o endereço da LAN. Se você estiver usando o WiFi para navegar na Internet, é o endereço IP WiFi do PC * O endereço IP que você visualizou no ipconfig é o seguinte: Adaptador Ethernet Conexão de rede sem fio: * Sufixo DNS específico da conexão. : Endereço IP. . . *. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Use o IP e a porta do servidor para criar um objeto de soquete e envie uma solicitação ao servidor para obter o valor do tamanho do arquivo Socket1 = new Socket (ServerAddr, Port); String message = "--- test_socket_android ---"; Log.d ("tcp", "c: enviando: '" + message + "'"); // Envie as informações para o servidor através deste objeto PrintWriter Out = new PrintWriter (new BufferWriter (new OutputStreamWriter (Socket1.getOutputStream ())), true); // Envie o conteúdo inserido pelo usuário para o servidor Out.println ("file_size"); out.flush (); // Receber Informações do servidor BufferReader in = new BufferredReader (new InputStreamReader (Socket1.getInputStream ())); // Obter tamanho do arquivo string str1 = in.readline (); Log.d ("tcp", str1); // converte o tamanho do arquivo em int-type int sum = Integer.parseint (str1); Log.d ("tcp", str1); // Fechar o fluxo de entrada em.close (); SharedPreferences sharedPreferences = getSharedPreferences (preference_name, modo); SharedPreferences.editor Editor = SharedPreferences .edit (); // busca os bytes transmitidos int pre = sharedPreferences.getInt ("downService", 0); int _pre = pré; // converte -o em uma string para enviar para a sequência do servidor s = string.valueof (_pre); // Use o IP e a porta do servidor para estabelecer um objeto de soquete e enviar uma solicitação ao servidor novamente para obter o soquete de conteúdo do arquivo = new Socket (ServerAddr, porta); // Envie a solicitação do caractere ao servidor para obter o arquivo de impressão de arquivo out1 = new PrintWriter (new BufferWriter (new O outputStreamWriter (Socket.getOutputStream ())), true); out1.println ("ok"+s); out1.flush (); out.Close (); // Defina o fluxo de entrada BufferInputStream bis = new bufferInputStream (Socket.getInputStream ()); String file1 = nome do arquivo; Arquivo string; // Determine se o SDCARD é inserido no telefone, insira o arquivo no cartão de memória se (Environment.GetexternalStorAgestate (). Iguals (Environment.media_mounted)) {arquivo sdcard = ambiente. // arquivo de definição de cartão SD Arquivo = sdcard.getCanonicalfile () + "/" + file1; // Defina o arquivo de saída do arquivo FileOutputStream fos = new FileOutputStream (arquivo, true); tente {int t = -1; int baixado = pré; // define o número de bytes por transmissão byte [] buff = new Byte [8192]; Log.i ("Sum", Sum + ""); // Comece a gravar o arquivo do servidor no cartão SD do telefone celular enquanto ((t = bis.read (buff))! = -1) {if (isStop == true) {break; } fos.write (buff, 0, t); baixado += t; // armazenamento o editor de progresso da transmissão.putInt ("downService", baixado); editor.Commit (); // Quando a transmissão for concluída, redefina as informações armazenadas se (baixado == SUM) {editor.putInt ("donService", 0); editor.Commit (); } // Obtenha o progresso da transferência de arquivo float wb = ((baixado * 100) / (float) soma); int wi = (int) wb; System.out.println (baixado); String str = string.valueof (wi) + "%"; // Envie o progresso da transferência de arquivo para a base para exibir para a mensagem do usuário msg = new message (); // gerar mensagem // gerar mensagem msg.what = 0x0001; // Definir tipo de mensagem // gerar pacote de dados de pacote de dados dados = new bundle (); data.putString ("Valor", STR); msg.setData (dados); // Use o manipulador para enviar mensagens MainActivity.myhandler.sendMessage (msg); } // Fechar o fluxo de entrada e saída bis.close (); fos.flush (); fos.close (); } catch (Exceção e) {bis.close (); fos.flush (); fos.close (); }} Log.d (tag, "do servidor: 'recebido" + "'"); } Catch (UnknownHostException e) {Log.e (Tag, "192.168.155.1 é o servidor do tio!"); } catch (Exceção e) {e.printStackTrace (); } finalmente {tente {socket.close (); } catch (Exceção e) {e.printStackTrace (); }}}}}}; workthread = novo thread (trabalho de fundo); // O método isalivo é usado para determinar se o thread WorkThread está ativado se (! workthread.isalive ()) {// gerar um novo thread workthread.start (); Log.v ("ServiceLife", "Thread começa a funcionar"); } else {Log.v ("WorkThread", "Thread foi chamado"); } return start_sticky; } @Override public void OnDestroy () {super.ondestroy (); // interrompe o thread usando interrupção isStop = true; Log.v ("serviceLife", "o método OnDestroy é chamado"); }} 5. Finalmente, não se esqueça de se registrar Androidmanifest.xml
<usa-permission Android: name = "Android.permission.internet"/> <usa-permission Android: name = "Android.permission.mount_unmount_filesystems"> </usa-permission> <usa-permission Android: "Android.permission.ite_ite_ite_ite_exission> Android: name = ". DownService"> </vice>
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.