Android连接socket服务器上传下载多个文件
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服务器上传下载多个文件的更多相关文章
- 向linux服务器上传下载文件方式收集
向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ...
- Linux下不借助工具实现远程linux服务器上传下载文件
# Linux下不借助工具实现远程linux服务器上传下载文件 ## 简介 - Linux下自带ssh工具,可以实现远程Linux服务器的功能- Linux下自带scp工具,可以实现文件传输功能 ## ...
- Python 一键上传下载&一键提交文件到SVN入基线工具
一键上传下载&一键提交文件到SVN入基线工具 by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用说明 1 注: 根据我司项目规则订制的一套工具,集成以下功能,源码 ...
- 【转】Android 服务器之SFTP服务器上传下载功能
原文网址:http://blog.csdn.net/tanghua0809/article/details/47056327 本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之 ...
- 【转】Android 服务器之SFTP服务器上传下载功能 -- 不错
原文网址:http://blog.csdn.net/tanghua0809/article/details/47056327 本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之 ...
- SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例
本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...
- Android+Spring Boot 选择+上传+下载文件
2021.02.03更新 1 概述 前端Android,上传与下载文件,使用OkHttp处理请求,后端使用Spring Boot,处理Android发送来的上传与下载请求.这个其实不难,就是特别多奇奇 ...
- java 通过sftp服务器上传下载删除文件
最近做了一个sftp服务器文件下载的功能,mark一下: 首先是一个SftpClientUtil 类,封装了对sftp服务器文件上传.下载.删除的方法 import java.io.File; imp ...
- Spring学习---Spring中利用组件实现从FTP服务器上传/下载文件
FtpUtil.java import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcepti ...
随机推荐
- openssl之BIO系列之6---BIO的IO操作函数
BIO的IO操作函数 ---依据openssl doc/crypto/bio/bio_read.pod翻译和自己的理解写成 (作者:DragonKing Mail:wzhah ...
- printf中的使用(c语言)
#include <stdio.h> int main(int argc, const char * argv[]) { //整形输出 printf("%d,%d",3 ...
- legend---五、如何优雅的实现多继承
legend---五.如何优雅的实现多继承 一.总结 一句话总结:多继承可以通过把别人对象作为属性来调用属性的方法执行, 继承的本质也是为了调用方法和属性,而上述的方式可以满足 1.php中前端可以共 ...
- spring-cloud导入eclipse时,@slf4j注解为什么找不到log变量
原因是缺少插件Lomboz. Lomboz是一个基于LGPL的开源J2EE综合开发环境的Eclipse插件,对编码,发布,测试,以及debug等各个软件开发的生命周期提供支持,支持JSP,EJB等.L ...
- Android自定义组件系列【14】——Android5.0按钮波纹效果实现
今天任老师发表了一篇关于Android5.0中按钮按下的波纹效果实现<Android L中水波纹点击效果的实现>,出于好奇我下载了源代码看了一下效果,正好手边有一个Nexus手机,我结合实 ...
- Chromium Graphics : GPU Accelerated Compositing in Chrome
GPU Accelerated Compositing in Chrome Tom Wiltzius, Vangelis Kokkevis & the Chrome Graphics team ...
- nvm安装node流程及报错解决
第一步:下载NVM下载nvm并解压 nvm-window 下载地址:https://github.com/coreybutler/nvm-windows/releases 下载文件,然后解压得到nvm ...
- python数据处理技巧一
字符串赋值(传参)技巧 Python中一般的字符串赋值的方式如下: variable = "Test" print "I just [%s] unit"%var ...
- CSUOJ 1551 Longest Increasing Subsequence Again
1551: Longest Increasing Subsequence Again Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 75 Solved ...
- 第一天,Mysql安装,DDL(数据库定义语言),DBA,DML(数据库操纵语言),导入外面的sql文件
把“D:\mysql-5.6.22-winx64\bin”添加到系统环境变量path中了,然后在任意目录可访问mysql等命令,这样如登录等操作就不需要进入MySQL安装目录才好执行! MySQL下载 ...