前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android socket实现文件导出功能

android socket实现文件导出功能

作者头像
提莫队长
发布2019-03-01 09:44:25
7790
发布2019-03-01 09:44:25
举报
文章被收录于专栏:刘晓杰刘晓杰

该功能主要描述如下:将SD卡中的文件通过socket导出到window文件夹中。 首先我要先介绍一个客户端和服务器端共有的一个文件类: UploadFile.java

代码语言:javascript
复制
package org.lxh.util;

import java.io.Serializable;

public class UploadFile implements Serializable {
    private static final long serialVersionUID = 1L;
    private String title;                           // 信息标题
    private byte[] contentData;                     // 文件内容
    private String mimeType;                        // 文件类型
    private long contentLength;                     // 文件长度
    private String ext;                             // 扩展名

    public String getExt() {
        return ext;
    }
    public void setExt(String ext) {
        this.ext = ext;
    }

    public String getMimeType() {
        return mimeType;
    }
    public void setMimeType(String mimeType) {
        this.mimeType = mimeType;
    }

    public long getContentLength() {
        return contentLength;
    }
    public void setContentLength(long contentLength) {
        this.contentLength = contentLength;
    }

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }

    public byte[] getContentData() {
        return contentData;
    }
    public void setContentData(byte[] contentData) {
        this.contentData = contentData;
    }
}

下面介绍一下服务器端的实现: 服务器端需要实现的功能有:创建socket,绑定并监听客户端,获取传过来的文件并保存,还要返回一个标识,标识数据获取完毕,然后关闭socket 所以代码有两个文件。 MyService.java

代码语言:javascript
复制
package org.lxh.server;

import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {

    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(8888);//创建socket
        System.out.println("服务器运行,等待客户端连接。") ;
        boolean flag = true;
        while (flag) {
            Socket client = server.accept();//绑定并监听客户端
            new Thread(new ServerThreadUtil(client)).start() ;
            //由于文件操作涉及到网络,必须开启一个线程执行
        }
        server.close();//关闭socket
    }
}

ServerThreadUtil.java 功能:获取传过来的文件并保存,还要返回一个标识

代码语言:javascript
复制
package org.lxh.server;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.UUID;

import org.lxh.util.UploadFile;

public class ServerThreadUtil implements Runnable {
    private static final String DIRPATH = "D:" + File.separator + "test"
            + File.separator;               
    private Socket client = null;           
    private UploadFile upload = null;   

    public ServerThreadUtil(Socket client) {
        this.client = client;                   
        System.out.println("新的客户端连接...");       
    }

    public void run() {                 
        try {
            PrintStream out = new PrintStream(
                    client.getOutputStream());          // 取得客户端输出流
            ObjectInputStream ois = new ObjectInputStream(client
                    .getInputStream());                 // 取得客户端的输入流
            this.upload = (UploadFile) ois.readObject(); // 读取对象
            System.out.println("文件标题:" + this.upload.getTitle());
            System.out.println("文件类型:" + this.upload.getMimeType());
            System.out.println("文件大小:" + this.upload.getContentLength());
            //以上是获取文件信息,下面是保存并且返回标记
            out.print(saveFile());                      // 返回标记
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                this.client.close();            
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private boolean saveFile() throws Exception {   
        File file = new File(DIRPATH + UUID.randomUUID() + "."
                + this.upload.getExt());//保存到D:\test目录下 
        if (!file.getParentFile().exists()) {           
            file.getParentFile().mkdirs();          
        }
        OutputStream output = null;             
        try {
            output = new FileOutputStream(file);        
            output.write(this.upload.getContentData());//写入文件
            return true;                        
        } catch (Exception e) {
            return false;                           
        } finally {
            output.close();                 
        }
    }
}

注意哦,这是一个Java工程文件。接下来介绍的客户端才是Android工程文件。 客户端功能是:主动发送文件信息然后获取回传的标识。

代码语言:javascript
复制
package org.lxh.demo;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.Socket;

import org.lxh.util.UploadFile;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MyClientDemo extends Activity {
    private Button send = null;
    private TextView info = null; 
    //修改界面
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
                String result = msg.obj.toString();
                if ("true".equals(result)) {
                    MyClientDemo.this.info.setText("操作成功!"); // 设置文本
                } else {
                    MyClientDemo.this.info.setText("操作失败!"); // 设置文本
                }
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        send = (Button) findViewById(R.id.send);
        info = (TextView) findViewById(R.id.info);
        send.setOnClickListener(new SendOnClickListenerImpl());
    }

    private class SendOnClickListenerImpl implements OnClickListener {
        @Override
        public void onClick(View view) {
            new Thread(new Runnable() {//网络操作,开启新线程
                @Override
                public void run() {
                        try {
                            Socket client = new Socket("10.107.56.64", 8888);
                            //客户端连接的是windows系统,那自然是你自己的电脑的IP
                            BufferedReader buf = new BufferedReader(
                                    new InputStreamReader(client
                                            .getInputStream()));
                            ObjectOutputStream oos = new ObjectOutputStream(
                                    client.getOutputStream());

                            UploadFile myFile = getUploadFile();
                            //获取android系统中的文件

                            oos.writeObject(myFile); // 上传对象

                            String result = buf.readLine();//获取回传的标识
                            //根据标识修改textView中的文字
                            Message message = handler.obtainMessage(1, result);
                            handler.sendMessage(message);

                            oos.close();
                            buf.close();
                            client.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }               
                }
            }).start();
        }

        //从SD卡中读取数据
        private UploadFile getUploadFile() throws Exception {
            UploadFile myFile = new UploadFile();
            myFile.setTitle("DISNEY公园");
            myFile.setMimeType("image/jpeg");
            File file = new File(Environment.getExternalStorageDirectory()
                    .toString() + File.separator + "disney.jpg");
            InputStream input = null;
            try {
                input = new FileInputStream(file);
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                byte data[] = new byte[1024];
                int len = -1;
                while ((len = input.read(data)) != -1) {
                    bos.write(data, 0, len);
                }
                myFile.setContentData(bos.toByteArray());
                myFile.setContentLength(file.length());
                myFile.setExt("jpg");
            } catch (Exception e) {
                throw e;
            } finally {
                input.close();
            }
            return myFile;
        }
    }
}

不要忘了客户端也需要UploadFile.java文件哦

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年03月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档