android连接socket服务器上传下载多个文件

android连接socket服务器上传下载多个文件
1.socket服务端SocketServer.java
public class SocketServer {
	int port = 8888;// 端口号,必须与客户端一致
	// 选择进行传输的文件(测试)
	String path = "C:\\Temp";
	String filePath = "E:\\img.png";
	Socket client;
	public static void main(String arg[]) {
		System.out.println("-----准备建立socket链接----");
		new SocketServer().start();
	}
	void start() {
		try {
			ServerSocket serverSocket = new ServerSocket(port);
			while (true) {
				// IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
				client = serverSocket.accept();
				try {
					System.out.println("-----建立socket链接----");
					// 向客户端发送多个文件(测试)
					setMoreMessage(path);
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					client.close();
					System.out.println("close");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


	// 向客户端发送信息
	private void setMessage(String filePath, DataOutputStream ps)
			throws IOException {
		File fi = new File(filePath);
		System.out.println("要发送的文件长度:" + (int) fi.length() + "字節");
		// 向客户端发送信息
		DataInputStream fis = new DataInputStream(new BufferedInputStream(
				new FileInputStream(filePath)));
		// 将文件名及长度传给客户端。中文名需要处理
		ps.writeUTF(fi.getName());
		ps.flush();
		ps.writeLong((long) fi.length());
		ps.flush();


		int bufferSize = 8192;
		byte[] buf = new byte[bufferSize];


		while (true) {
			int read = 0;
			if (fis != null) {
				read = fis.read(buf);
			}


			if (read == -1) {
				break;
			}
			ps.write(buf, 0, read);
		}
		ps.flush();
		fis.close();
		System.out.println("文件中传输。。。");
	}


	/**
	 * 向客户端发送多个文件
	 * @param path
	 * @throws IOException
	 */
	private void setMoreMessage(String path) throws IOException {
		File root = new File(path);
		if (!root.exists()) {
			root.mkdir();
			return;
		}
		String[] colum = root.list();
		System.out.println("The file's num is :" + colum.length);
		// 写入流
		DataOutputStream ps = new DataOutputStream(client.getOutputStream());
		// 写出流
		DataInputStream dis = new DataInputStream(new BufferedInputStream(
				client.getInputStream()));
		// 写出文件总个数
		ps.writeInt(colum.length);
		ps.flush();


		System.out.println(dis.readBoolean() ? "开始上传文件" : "开始上传失败");// 接收客户端返回的上传信息
		System.out.println();
		for (int i = 0; i < colum.length; i++) {
			System.out.println("The colum's content is :" + colum[i]);
			String filePath = path + "\\" + colum[i];
			setMessage(filePath, ps);// 上传文件
			System.out.println(dis.readBoolean() ? "成功上传文件" : "上传失败");// 接收客户端返回的上传信息
		}
		System.out.println("-----文件传输完成------");
	}


	// 接收客户端发送的信息
	private void getMessage(DataInputStream inputStream) {
		try {
			// 本地保存路径,文件名会自动从服务器端继承而来。
			String savePath = "D://android_img/";
			File file = new File(savePath);
			// 创建文件夹
			if (!file.exists()) {
				file.mkdirs();
			}
			int bufferSize = 8192;
			byte[] buf = new byte[bufferSize];
			int passedlen = 0;
			long len = 0;


			savePath += inputStream.readUTF();
			DataOutputStream fileOut = new DataOutputStream(
					new BufferedOutputStream(new BufferedOutputStream(
							new FileOutputStream(savePath))));
			len = inputStream.readLong();


			System.out.println("文件的长度为:" + len + "\n");
			System.out.println("开始接收文件!" + "\n" + getTime());


			while (true) {
				int read = 0;
				if (inputStream != null) {
					read = inputStream.read(buf);
				}
				passedlen += read;
				if (read == -1) {
					break;
				}
				// 进度条,如果是大文件,可能会重复打印出一些相同的百分比
				System.out.println("文件接收了" + (passedlen * 100 / len) + "%\n");
				fileOut.write(buf, 0, read);
			}
			// 花费的时间
			System.out.println("接收完成,文件存为" + savePath + "\n" + getTime());


			fileOut.close();
		} catch (Exception e) {
			System.out.println("接收消息错误" + "\n" + e.toString());
			return;
		}
	}
	public static String getTime() {
		long tmp = System.currentTimeMillis();// 花费的时间
		SimpleDateFormat formatter = new SimpleDateFormat(
				"yyyy年-MM月dd日-HH时mm分ss秒");
		Date date = new Date(tmp);
		return formatter.format(date);
	}
}


2.android客户端下文件ImageDownLoadUtil.java
/**
 * 发送接收文件
 * @ClassName: ClientTest
 * @Description: TODO
 * @author jalin
 * @date 2014-4-16 上午11:37:30
 */
public class ImageDownLoadUtil extends Thread implements Runnable {
	private ClientSocket client = null;
	private Context context;
	private String IP = "192.168.1.2";// 本地ip
	private int PORT = 8888; // 端口号
	private boolean resule = false;
	String filePath = "";// android手机文件路径
	String filename = "";//存放圖片的文件夾名
	public int type = 0;//模式
	public boolean isContinue = true;


	public ImageDownLoadUtil(Context context) {
		this.context = context;
		this.filePath = Session.DATABASE_PATH;
		filename=Session.IMAGE_FILENAME;
		try {
			if (createConnection()) {				
				//  type = 2;//接受文件
				// sendMessage();//发送文件、信息
				type = 1;//接受文件
				this.start();
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}


	/**
	 * 得到socket鏈接通道
	 * @return
	 */
	private boolean createConnection() {
		client = new ClientSocket(IP, PORT);
		try {
			client.CreateConnection();
			System.out.print("创建连接成功!");
			return true;
		} catch (Exception e) {
			System.out.print("创建连接失败!");
			return false;
		}
	}
	@Override
	public void run() {
		switch (type) {
		case 1:// 下载多個图片文件
			resule = false;
			if (client == null)
				return;
			DataInputStream inputStream = null;// 写入流
			DataOutputStream out = null;// 写出流
			try {
				inputStream = client.getDataInputStream();// 写入流
				out = client.getDataOutputStream();// 写出流


				int fileLenght = inputStream.readInt();//得到文件總數量


				out.writeBoolean(true);// 发送上传開始標誌
				out.flush();
				// 文件存储路径
				String savePath = filePath + "/" + filename + "/";
				while ((fileLenght--) > 0) {
					resule=saveFile(inputStream,savePath);// 保存图片
					out.writeBoolean(resule);// 发送上传结果
					out.flush();
				}
			} catch (Exception e) {
				System.out.print("接收文件出错!");
				return;
			}finally{
				Message msg=new Message();
				if (resule) {
					msg.what=1;
				}else{
					msg.what=-1;
				}
				handler.sendMessage(msg);
			}
			break;


		default:
			break;
		}
	}


	/**
	 * 保存文件
	 * @param inputStream
	 * @return
	 */
	private boolean saveFile(DataInputStream inputStream,String savePath) {
		boolean resule=false;
		try {
			if (!new File(savePath).exists()) {
				new File(savePath).mkdir();
			}
			int bufferSize = 1024 * 8;
			byte[] buf = new byte[bufferSize];
			int passedlen = 0;
			long len = 0;
			//得到文件名称
			String saveFilePate=savePath +inputStream.readUTF();
			File image = new File(saveFilePate);
			if (image.exists()) {
				image.delete();
			}
			DataOutputStream fileOut = new DataOutputStream(
					new BufferedOutputStream(new BufferedOutputStream(
							new FileOutputStream(saveFilePate))));
			len = inputStream.readLong();


			System.out.println("文件长度:" + len);
			long tmp = System.currentTimeMillis();// 获取当前系统时间
			System.out.println("开始发送时间:" + "\n" + tmp);
			int redLen = 0;
			while (true) {
				int read = 0;
				if (inputStream != null && passedlen < len) {//文件接收结束标志
					read = inputStream.read(buf);
				}
				passedlen += read;
				if (read == -1 || read == 0) {
					break;
				}
				//
				System.out.println("当前进度:" + (passedlen * 100 / len) + "%\n");
				fileOut.write(buf, 0, read);
			}
			tmp = System.currentTimeMillis();// 当前时间
			System.out.println("文件保存路径:" + saveFilePate + "---时间:" + tmp);
			fileOut.close();
			resule = true;
		} catch (Exception e) {
			System.out.println("出错了:" + e.toString());
			return resule;
		}finally{
		}
		return resule;
	}


	/*
	 * 发送文件、信息
	 */
	private void sendMessage() {
		if (client == null)
			return;
		try {
			System.out.print("文件路径:" + filePath);
			client.sendMessage(filePath);
		} catch (Exception e) {
			System.out.print("发送文件出错!");
		}
	}
	Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				// 执行定时器时间到了之后由handler传递的任务
				Toast.makeText(context, "下载图片成功", Toast.LENGTH_LONG).show();
				break;
			case -1:
				// 执行定时器时间到了之后由handler传递的任务
				Toast.makeText(context, "下载图片失败", Toast.LENGTH_LONG).show();
				break;
			}
			super.handleMessage(msg);
		}
	};
}


3.Socket客戶端
/**
 * Socket客戶端
 * 
 * @ClassName: ClientSocket
 * @Description: TODO
 * @author jalin
 * @date 2014-4-16 下午5:10:31
 */
public class ClientSocket {
	private String ip;


	private int port;


	private Socket socket = null;


	private DataOutputStream out = null;


	private DataInputStream getMessageStream = null;


	public ClientSocket(String ip, int port) {
		this.ip = ip;
		this.port = port;
	}
	/**
	 * 创建socket连接
	 * 
	 * @throws Exception
	 *             exception
	 */
	public void CreateConnection() throws Exception {
		try {
			socket = new Socket(ip, port);
		} catch (Exception e) {
			e.printStackTrace();
			if (socket != null)
				socket.close();
			throw e;
		} finally {
		}
	}
	/**
	 * 發送圖片
	 * @param filePath
	 * @throws Exception
	 */
	public void sendMessage(String filePath) throws Exception {
		try {
			// 获取本地文件
			File file = new File(filePath);
			getMessageStream = new DataInputStream(new BufferedInputStream(
					new FileInputStream(filePath)));
			out = new DataOutputStream(socket.getOutputStream());
			 out.writeUTF(filePath);
			// 发送文件属性
			out.writeUTF(file.getName());
			out.flush();
			out.writeLong((long) file.length());
			out.flush();
			int bufferSize = 1024 * 8;
			byte[] buf = new byte[bufferSize];
			while (true) {
				int read = 0;
				if (getMessageStream != null) {
					read = getMessageStream.read(buf);
				}


				if (read == -1) {
					break;
				}
				out.write(buf, 0, read);
			}
			out.flush();
			getMessageStream.close();
			System.out.println("-----发送完成------");
		} catch (Exception e) {
			System.out.println(e.toString());
		} finally {
			if (out != null)
				out.close();
		}
	}


	public DataOutputStream getDataOutputStream() {
		try {
			out = new DataOutputStream(socket.getOutputStream());
			return out;
		} catch (IOException e) {
			e.printStackTrace();
			try {
				if (out != null) {
					out.close();
				}
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		return null;
	}


	public DataInputStream getDataInputStream() throws Exception {
		try {
			getMessageStream = new DataInputStream(new BufferedInputStream(
					socket.getInputStream()));
			return getMessageStream;
		} catch (Exception e) {
			e.printStackTrace();
			if (getMessageStream != null)
				getMessageStream.close();
			throw e;
		} finally {
		}
	}


	public int getFileLenght() {
		try {
			return getDataInputStream().readInt();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -1;
	}
	public void shutDownConnection() {
		try {
			if (out != null)
				out.close();
			if (getMessageStream != null)
				getMessageStream.close();
			if (socket != null)
				socket.close();
		} catch (Exception e) {


		}
	}
}


4.activity按钮事件 new ImageDownLoadUtil(this);



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值