通过SOCKET实现文件下载
16lz
2021-01-26
服务端代码
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;}@Overridepublic 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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {this.interrupt();}}}}
基本可以直接用,根据自己需要稍微改动就OK了
更多相关文章
- ANDROID媒体文件扫描
- android文件访问实例
- Java W3C 生成 XML
- android混淆文件
- NDK打包的ANT脚本(包含引入so文件)
- 关于webView 上传文件问题解决
- Android(安卓)ToggleButton example
- android下多线程下载,断点续传,及暂停按钮
- cts android.hardware.camera2.cts.RecordingTest --testBasicRe