Android通过SOCKET下载文件的方法

作者:q757989418 时间:2023-08-27 01:11:48 

本文实例讲述了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 + "\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程序设计有所帮助。

标签:Android,SOCKET
0
投稿

猜你喜欢

  • Java全面细致讲解Cookie与Session及kaptcha验证码的使用

    2021-09-03 23:10:56
  • Spring Boot如何通过自定义注解实现日志打印详解

    2022-07-04 14:10:18
  • Spring Boot2.x集成JPA快速开发的示例代码

    2022-11-21 04:55:41
  • SpringBoot过滤器与拦截 器深入分析实现方法

    2023-11-28 23:04:15
  • System.getProperty(user.dir)定位问题解析

    2023-11-20 08:50:44
  • springboot集成Swagger的方法(让你拥有属于自己的api管理器)

    2023-11-08 20:39:15
  • 详解SpringMVC中的日期处理和文件上传操作

    2021-11-13 05:39:18
  • 理解Java当中的回调机制(翻译)

    2023-03-15 04:21:00
  • Java调用接口如何获取json数据解析后保存到数据库

    2023-11-16 15:01:36
  • Android实现手机多点触摸画圆

    2022-03-23 06:23:16
  • android实现倒计时功能代码

    2022-06-28 03:57:31
  • 基于Android AppWidgetProvider的使用介绍

    2021-09-27 08:48:19
  • springBoot 创建定时任务过程详解

    2022-10-17 18:51:55
  • android downsample降低音频采样频率代码

    2021-11-19 15:32:59
  • Android 三种实现定时器详解及实现方法

    2021-11-18 21:53:42
  • c#字符串编码编码(encoding)使用方法示例

    2022-10-04 07:24:58
  • java获取中文拼音首字母工具类定义与用法实例

    2023-07-14 08:23:55
  • Android编程实现给Button添加图片和文字的方法

    2021-11-27 21:30:20
  • 详解三种C#实现数组反转方式

    2023-10-09 20:29:23
  • Java 输入流中的read(byte[] b)方法详解

    2022-08-13 18:58:12
  • asp之家 软件编程 m.aspxhome.com