该功能主要描述如下:将SD卡中的文件通过socket导出到window文件夹中。
首先我要先介绍一个客户端和服务器端共有的一个文件类:
UploadFile.java
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
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 功能:获取传过来的文件并保存,还要返回一个标识
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工程文件。
客户端功能是:主动发送文件信息然后获取回传的标识。
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文件哦