通过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了 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值