android连接socket服务器上传下载多个文件
1.socket服务端SocketServer.java
2.android客户端下文件ImageDownLoadUtil.java
3.Socket客戶端
4.activity按钮事件 new ImageDownLoadUtil(this);
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);