Android通过SOCKET下载文件的方法

这篇文章主要介绍了Android通过SOCKET下载文件的方法,实例分析了Android使用Socket进行文件传输的技巧,需要的朋友可以参考下

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

服务端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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();
    }
   }
  }
}


客户端代码,下载线程


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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 + "\n" ).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程序设计有所帮助。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值