zoukankan      html  css  js  c++  java
  • 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 + "
    ");
                System.out.println("开始接收文件!" + "
    " + 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) + "%
    ");
                    fileOut.write(buf, 0, read);
                }
                // 花费的时间
                System.out.println("接收完成,文件存为" + savePath + "
    " + getTime());
    
    
                fileOut.close();
            } catch (Exception e) {
                System.out.println("接收消息错误" + "
    " + 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("开始发送时间:" + "
    " + 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) + "%
    ");
                    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);

  • 相关阅读:
    Containers vs Serverless:本质区别是什么?
    博云 x 某农商行 | 银行信息化运维系统升级的最佳实践
    兼容传统应用,蓄力边缘云——博云胖容器解决方案
    使用Bookinfo应用测试Kuma服务网格
    干货 | 博云基于OVS自研容器网络插件在金融企业的落地实践
    开源分布式事务中间件Seata使用指南
    调研 | 5种分布式事务解决方案优缺点对比
    Ambassador,云原生应用的“门神”
    容器网络插件那么多,博云为什么基于OVS深度自研?
    观察 | 边缘云计算的概念理解
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7139874.html
Copyright © 2011-2022 走看看