Android连接socket服务器上传下载多个文件
Posted 星辰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
以上是关于Android连接socket服务器上传下载多个文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android 上检查 socket.io 连接或断开连接?
自己写了一个Android的APP,想用socket连接服务器