文档章节

android通过socket上传文件

一别经年
 一别经年
发布于 2014/01/14 23:37
字数 894
阅读 5707
收藏 7

思想:

    1.直接将所有数据安装字节数组发送

    2.对象序列化方式

两种方式:

一、thread方式

Client1 :

  1. 主界面

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.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;    
    @Override
    public void onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);        
    super.setContentView(R.layout.main);        
    this.send = (Button) super.findViewById(R.id.send);        
    this.info = (TextView) super.findViewById(R.id.info);        
    this.send.setOnClickListener(new SendOnClickListener());
    }    
    private class SendOnClickListener implements OnClickListener {
        @Override
        public void onClick(View v) {            
            try {                
                final Socket client = new Socket("192.168.1.114", 8888);
                BufferedReader buf = new BufferedReader(new InputStreamReader(
                        client.getInputStream())); // 读取返回的数据
                new Thread(new Runnable() {                    
                    @Override
                    public void run() {                        
                        try {
                                ObjectOutputStream oos = new ObjectOutputStream(
                                    client.getOutputStream());
                                UploadFile myFile = SendOnClickListener.this.getUploadFile();
                                oos.writeObject(myFile);//写文件对象
                                oos.close();
                            } catch (Exception e) {
                            }
                    }
                }).start();
                String result = buf.readLine(); // 接收返回信息
                System.out.println("**************** " + result);                
                if ("true".equals(result)) {
                    MyClientDemo.this.info.setText("操作成功!");
                } else {
                    MyClientDemo.this.info.setText("操作失败!");
                }
                buf.close();
                client.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }   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 = 0;                
                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;
        }
    }
}

2.序列化文件对象

package org.lxh.util;
import java.io.Serializable;
@SuppressWarnings("serial")
public class UploadFile implements Serializable {
    private String title ;    
    private byte [] contentData ;    
    private String mimeType ;    
    private long contentLength ;    
    private String ext ;    
    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;
    }    
    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 getExt() {        
        return ext;
    }    
    public void setExt(String ext) {        
        this.ext = ext;
    }
}

二、handler方式

Client:

1.主界面

public class MyClientDemo extends Activity {
    private Button send = null;    
    private TextView info = null;    
    private static final int FINISH = 0 ;    
    private Handler myHandler = new Handler(){        
    @Override
    public void handleMessage(Message msg) {            
        switch(msg.what) {            
        case FINISH:
                String result = msg.obj.toString() ;    // 取出数据
                if ("true".equals(result)) {
                    MyClientDemo.this.info.setText("操作成功!");
                } else {
                    MyClientDemo.this.info.setText("操作失败!");
                }                break ;
            }
        }
    } ;    
    @Override
    public void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);        
        super.setContentView(R.layout.main);        
        this.send = (Button) super.findViewById(R.id.send);        
        this.info = (TextView) super.findViewById(R.id.info);        
        this.send.setOnClickListener(new SendOnClickListener());
    }    
    private class SendOnClickListener implements OnClickListener {
        @Override
        public void onClick(View v) {            
            try {                
                    final Socket client = new Socket("192.168.1.114", 8888);                
                    final BufferedReader buf = new BufferedReader(new InputStreamReader(
                        client.getInputStream())); // 读取返回的数据
                    new Thread(new Runnable() {                    
                        @Override
                        public void run() {                        
                            try {
                                    ObjectOutputStream oos = new ObjectOutputStream(
                                        client.getOutputStream());
                                    UploadFile myFile = SendOnClickListener.this.getUploadFile();
                            oos.writeObject(myFile);
                            String str = buf.readLine() ;    // 读取数据
                            oos.close();
                            Message msg = MyClientDemo.this.myHandler.obtainMessage(FINISH, str);
                            MyClientDemo.this.myHandler.sendMessage(msg) ;
                            buf.close();
                            client.close();
                        } catch (Exception e) {
                            e.printStackTrace() ;
                        }
                    }
                }).start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

2.序列化文件对象

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 = 0;                
                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;
        }
    }
}

server端

package org.lxh.server;
import java.net.ServerSocket;
public class MyServer {
    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(8888); // 服务器端端口
        boolean flag = true; // 定义标记,可以一直死循环
        while (flag) { // 通过标记判断循环
            new Thread(new ServerThreadUtil(server.accept())).start(); // 启动线程
        }
        server.close(); // 关闭服务器
    }
}

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 + "mldnfile"
            + File.separator; // 目录路径
    private Socket client = null;    
    private UploadFile upload = null;    
    public ServerThreadUtil(Socket client) {        
        this.client = client;
        System.out.println("新的客户端连接...");
    }    
    @Override
    public void run() {        
        try {
                PrintStream out = new PrintStream(this.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(this.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());        
         if (!file.getParentFile().exists()) {
            file.getParentFile().mkdir();
        }
        OutputStream output = null;        
            try {
                    output = new FileOutputStream(file) ;
                    output.write(this.upload.getContentData()) ;            
                    return true ;
            } catch (Exception e) {            
                    throw e;
            } finally {
                output.close();
        }
    }
}


本文转载自:http://www.cnblogs.com/itfan/p/3161192.html

共有 人打赏支持
一别经年
粉丝 17
博文 174
码字总数 60456
作品 0
西安
程序员
私信 提问
每周总结20130821——android控件的尺寸、http文件上传

Android控件的尺寸 android开发中,可以通过编写XML格式的布局文件来实现布局,也可以用纯代码进行布局,通常都是选择XML文件布局。在XML布局文件中,与控件的尺寸有关的属性有android:minHe...

Pupa
2013/08/21
0
0
Android开发_swiftp开源ftp服务端移植

swiftp是一个开源的ftp server,源码可以从下面地址拉。 Google code : http://code.google.com/p/swiftp/downloads/list GitHub : https://github.com/ppareit/swiftp 自己的需求是将ftp......

mstian06
2013/12/26
0
1
Android上传文件到服务器

Android要实现文件上传,可以利用Socket上传,也可以模拟Web进行上传,但是如果是使用第一种方式上传,严格的话就得使用TCP,这样容易生成系统死掉,或者是长时间等待,如果是UDP来传,就容易...

凯文加内特
2015/04/20
0
0
android开发,小米上传文件到百分百卡住

android开发上传音乐功能。在其他手机,类似华为,三星可以成功上传音乐。 可是在小米2s还有锤子手机上上传到百分百就卡住了,没有显示成功还是失败,音乐列表没有更新,应该是上传失败了。 ...

集美路人丙
2016/04/19
103
0
对文件的上传和下载用哪一种协议比较好

问题: android 实现对视频文件的上传和下载 是用HTTP 还是用socket 。 求前辈指教。

爱上马克思的恩格斯
2012/12/21
252
1

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
3
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
3
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部