zoukankan      html  css  js  c++  java
  • Android 通过SOCKET下载文件的方法

    本文实例讲述了Android通过SOCKET下载文件的方法。分享给大家供大家参考,具体如下:

    服务端代码

    import java.io.BufferedInputStream;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Scanner;
    public class FunctionServer {
     private static int PORT = 2012;
     private String path = "需要下载的文件所在路径";
     public static void main(String[] args) throws IOException{
      FunctionServer server = new FunctionServer();
      server.start();
     }
     public void start() throws IOException{
      ServerSocket ss = new ServerSocket(PORT);
      while(true){
       Socket s = ss.accept();
       new Service(s).start();//创建线程
      }
     }
     class Service extends Thread{
      Socket s;
      public Service(Socket s){
       this.s = s;
      }
      public void run(){
       try{
        InputStream in = s.getInputStream();//得到输入流
        Scanner sc = new Scanner(in);
        OutputStream out = s.getOutputStream();
        while(true){
         String str = sc.nextLine();//读取文件名
         if(!str.equals(null)){
          System.out.println("你的文件名是"+str);
          //根据路径和文件名获取文件
          File f = new File(path+str);
          FileInputStream fis = new FileInputStream(f);
          DataInputStream dis = new DataInputStream(new BufferedInputStream(fis));
          byte[] buffer = new byte[8192];
          DataOutputStream ps = new DataOutputStream(out);
          ps.writeLong((long) f.length());//发送文件大小
          ps.flush();
          while(true) {
           int read = 0;
           if(dis!=null){
            read = fis.read(buffer);
           }
           if(read == -1){
            break;
           }
           ps.write(buffer,0,read);
          }
          ps.flush();
          dis.close();
          s.close();
          out.flush();
          break;
         }
        }
       }catch(IOException e){
        e.printStackTrace();
       }
      }
     }
    }

    客户端代码,下载线程

    class DownloadThread extends Thread {
      Socket socket;
      InputStream in;
      OutputStream out;
      String path = "文件保存路径";
      String functionName;
      String serverIp = "服务器IP";
      int socketPort = "服务端口号";
      int fileSize,downLoadFileSize;
      public DownloadThread(String functionName) {
       this.functionName = functionName;
      }
      @Override
      public void run() {
       Looper.prepare();
       while(!Thread.interrupted()){
        try {
         socket = new Socket(serverIp, socketPort);
         InputStream in = socket.getInputStream();
         OutputStream out = socket.getOutputStream();
         out.write((functionName + "
    ").getBytes("gbk"));
         out.flush(); // 清理缓冲,确保发送到服务端
         File f = new File(path + functionName);
         OutputStream song = new FileOutputStream(f);
         DataInputStream dis = new DataInputStream(
           new BufferedInputStream(in));
         DataOutputStream dos = new DataOutputStream(
           new BufferedOutputStream(song));
         fileSize = (int) dis.readLong() - 1;
         System.out.println("开始下载");
         byte[] buffer = new byte[8192];
         while (true) {
          int read = 0;
          if (dis != null) {
           read = dis.read(buffer);
           downLoadFileSize += read;
            }
          if (read == -1) {
           break;
          }
          dos.write(buffer, 0, read);
         }
         System.out.println("文件下载完成");
         dos.close();
        } catch (UnknownHostException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
        } finally {
         this.interrupt();
        }
       }
      }
     }
     
    
    基本可以直接用,根据自己需要稍微改动就OK了
    
    希望本文所述对大家Android程序设计有
  • 相关阅读:
    C++ mutex&&RWlock
    一个资源池模型
    C++安全编码摘录
    C++点滴
    git常用命令(转)
    ASN.1
    TDOA泰勒级数法
    teamviewer解除最大通话限制-特别破解版(转)
    剑指offer——旋转数组的最小数字
    常见的相关分析方法——结合实例
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/6866353.html
Copyright © 2011-2022 走看看