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服务器上传下载多个文件的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 没有流式传输到多个连接

如何在 android 上检查 socket.io 连接或断开连接?

自己写了一个Android的APP,想用socket连接服务器

C# Winform 多线程 SOCKET 文件上传,下载

Socket io 未在 HTTPS 中将 nodejs 与 android(客户端)连接

基于Socket的Android聊天室