android连接socket服务器上传下载多个文件
1.socket服务端SocketServer.java

public class SocketServer {
int port = ;// 端口号,必须与客户端一致
// 选择进行传输的文件(测试)
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 = ;
byte[] buf = new byte[bufferSize]; while (true) {
int read = ;
if (fis != null) {
read = fis.read(buf);
} if (read == -) {
break;
}
ps.write(buf, , 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 = ; 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 = ;
byte[] buf = new byte[bufferSize];
int passedlen = ;
long len = ; 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 = ;
if (inputStream != null) {
read = inputStream.read(buf);
}
passedlen += read;
if (read == -) {
break;
}
// 进度条,如果是大文件,可能会重复打印出一些相同的百分比
System.out.println("文件接收了" + (passedlen * / len) + "%\n");
fileOut.write(buf, , 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 = ; // 端口号
private boolean resule = false;
String filePath = "";// android手机文件路径
String filename = "";//存放圖片的文件夾名
public int type = ;//模式
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 = ;//接受文件
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 :// 下载多個图片文件
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--) > ) {
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=;
}else{
msg.what=-;
}
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 = * ;
byte[] buf = new byte[bufferSize];
int passedlen = ;
long len = ;
//得到文件名称
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 = ;
while (true) {
int read = ;
if (inputStream != null && passedlen < len) {//文件接收结束标志
read = inputStream.read(buf);
}
passedlen += read;
if (read == - || read == ) {
break;
}
//
System.out.println("当前进度:" + (passedlen * / len) + "%\n");
fileOut.write(buf, , 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 :
// 执行定时器时间到了之后由handler传递的任务
Toast.makeText(context, "下载图片成功", Toast.LENGTH_LONG).show();
break;
case -:
// 执行定时器时间到了之后由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 = * ;
byte[] buf = new byte[bufferSize];
while (true) {
int read = ;
if (getMessageStream != null) {
read = getMessageStream.read(buf);
} if (read == -) {
break;
}
out.write(buf, , 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 -;
}
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);

Android连接socket服务器上传下载多个文件的更多相关文章

  1. 向linux服务器上传下载文件方式收集

    向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ...

  2. Linux下不借助工具实现远程linux服务器上传下载文件

    # Linux下不借助工具实现远程linux服务器上传下载文件 ## 简介 - Linux下自带ssh工具,可以实现远程Linux服务器的功能- Linux下自带scp工具,可以实现文件传输功能 ## ...

  3. Python 一键上传下载&一键提交文件到SVN入基线工具

    一键上传下载&一键提交文件到SVN入基线工具   by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用说明 1   注: 根据我司项目规则订制的一套工具,集成以下功能,源码 ...

  4. 【转】Android 服务器之SFTP服务器上传下载功能

    原文网址:http://blog.csdn.net/tanghua0809/article/details/47056327 本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之 ...

  5. 【转】Android 服务器之SFTP服务器上传下载功能 -- 不错

    原文网址:http://blog.csdn.net/tanghua0809/article/details/47056327 本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之 ...

  6. SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例

    本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...

  7. Android+Spring Boot 选择+上传+下载文件

    2021.02.03更新 1 概述 前端Android,上传与下载文件,使用OkHttp处理请求,后端使用Spring Boot,处理Android发送来的上传与下载请求.这个其实不难,就是特别多奇奇 ...

  8. java 通过sftp服务器上传下载删除文件

    最近做了一个sftp服务器文件下载的功能,mark一下: 首先是一个SftpClientUtil 类,封装了对sftp服务器文件上传.下载.删除的方法 import java.io.File; imp ...

  9. Spring学习---Spring中利用组件实现从FTP服务器上传/下载文件

    FtpUtil.java import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcepti ...

随机推荐

  1. c#+ArcGIS Engine-获取矢量图层的空间参考

    转自原文c#+ArcGIS Engine-获取矢量图层的空间参考 介绍一种简单的获取矢量图层空间参考的方法: 首先打开Shp文件获得FeatureClass,代码如下: string pPath=&q ...

  2. ArcGIS api for javascript——设置可见的比例

    描述 ArcGIS JavaScript API的1.2版本加入更多地图如何缓存,切片和地图服务的控制.本例展示了如何限制地图能够接收切片的比例等级.如果不想用户过分的放大或缩小,即使切片存在这些极端 ...

  3. Draw the RGB data from kinect C++ via opengl

    In order to improve my English writing skills,I am going to  write the blogs in English form now! -- ...

  4. hadoop(八) - sqoop安装与使用

    一. sqoop安装: 安装在一台节点上就能够了. 1. 使用winscp上传sqoop 2. 安装和配置 加入sqoop到环境变量 将数据库连接驱动mysql-connector-5.1.8.jar ...

  5. oracle之ROWNUM的查询应用

    1 在ORACLE数据库中,ROWNUM是ORACLE数据库为查询结果加入的一个伪列.起始值为1.经常使用来处理查询结果的分页. 2 因为ROWNUM的特殊性,使用时候一般是分三层: 第一层:先进行查 ...

  6. !HDU 2602 Bone Collector--DP--(裸01背包)

    题意:这题就是一个纯粹的裸01背包 分析:WA了好几次.01背包实现的一些细节没搞懂 1.为什么dp[i][j]赋初值为0而不是value[i].由于第i个石头可能不放! 2.在进行状态转移之前要dp ...

  7. 关于APP上架制作二维码相关

    1.安卓版本APP上架并生成二维码问题:安卓版本上架国内市场,这个情况比较复杂一些,比如百度,网址是以上传APP生成的一个编号来进行的,每次升级更新后都发生了变化,也就相当于每次升级后网址发生改变(比 ...

  8. P3908 异或之和

    题目描述 求1 \bigoplus 2 \bigoplus\cdots\bigoplus N1⨁2⨁⋯⨁N 的值. A \bigoplus BA⨁B 即AA , BB 按位异或. 输入输出格式 输入格 ...

  9. javascript学习笔记总结

    1 有些浏览器可能不支持JavaScript,我们可以使用如下的方法对它们隐藏JavaScript代码. <html> <body> <script type=" ...

  10. refresh table tablename ;MSCK REPAIR TABLE table_name;

    在更改分区内的文件后刷新表 refresh table tablename ; 我们平时通常是通过alter table add partition方式增加Hive的分区的,但有时候会通过HDFS p ...