android socket 传文件,android通过socket上传文件

这篇博客介绍了Android客户端通过Socket与服务器进行数据传输的两种方式:线程方式和Handler方式,主要涉及对象序列化。客户端将UploadFile对象序列化后发送到服务器,服务器端接收到数据并反序列化,保存文件内容。博客详细展示了客户端和服务器端的代码实现,包括文件上传的标题、类型、长度等信息的处理。
摘要由CSDN通过智能技术生成

思想:

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

2.对象序列化方式

两种方式:

一、thread方式

Client1 :

主界面

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 .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 .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 .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();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值