Android 通过SOCKET下载文件的方法
本文实例讲述了Android通过SOCKET下载文件的方法。分享给大家供大家参考,具体如下:
服务端代码
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class FunctionServer {
private static int PORT = ;
private String path = "需要下载的文件所在路径";
public static void main(String[] args) throws IOException{
FunctionServer server = new FunctionServer();
server.start();
}
public void start() throws IOException{
ServerSocket ss = new ServerSocket(PORT);
while(true){
Socket s = ss.accept();
new Service(s).start();//创建线程
}
}
class Service extends Thread{
Socket s;
public Service(Socket s){
this.s = s;
}
public void run(){
try{
InputStream in = s.getInputStream();//得到输入流
Scanner sc = new Scanner(in);
OutputStream out = s.getOutputStream();
while(true){
String str = sc.nextLine();//读取文件名
if(!str.equals(null)){
System.out.println("你的文件名是"+str);
//根据路径和文件名获取文件
File f = new File(path+str);
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(new BufferedInputStream(fis));
byte[] buffer = new byte[];
DataOutputStream ps = new DataOutputStream(out);
ps.writeLong((long) f.length());//发送文件大小
ps.flush();
while(true) {
int read = ;
if(dis!=null){
read = fis.read(buffer);
}
if(read == -){
break;
}
ps.write(buffer,,read);
}
ps.flush();
dis.close();
s.close();
out.flush();
break;
}
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}
客户端代码,下载线程
class DownloadThread extends Thread {
Socket socket;
InputStream in;
OutputStream out;
String path = "文件保存路径";
String functionName;
String serverIp = "服务器IP";
int socketPort = "服务端口号";
int fileSize,downLoadFileSize;
public DownloadThread(String functionName) {
this.functionName = functionName;
}
@Override
public void run() {
Looper.prepare();
while(!Thread.interrupted()){
try {
socket = new Socket(serverIp, socketPort);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write((functionName + "\n").getBytes("gbk"));
out.flush(); // 清理缓冲,确保发送到服务端
File f = new File(path + functionName);
OutputStream song = new FileOutputStream(f);
DataInputStream dis = new DataInputStream(
new BufferedInputStream(in));
DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(song));
fileSize = (int) dis.readLong() - ;
System.out.println("开始下载");
byte[] buffer = new byte[];
while (true) {
int read = ;
if (dis != null) {
read = dis.read(buffer);
downLoadFileSize += read;
}
if (read == -) {
break;
}
dos.write(buffer, , read);
}
System.out.println("文件下载完成");
dos.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
this.interrupt();
}
}
}
}
基本可以直接用,根据自己需要稍微改动就OK了
希望本文所述对大家Android程序设计有
Android 通过SOCKET下载文件的方法的更多相关文章
- .net下载文件的方法
最近做项目遇到文件下载的问题,原本采用的是直接用一个href链接到需要下载的文件来处理这个问题,后来发现,如果文件是一个图片,浏览器会自动打开图片而不是下载,需要用户右击另存为才可以下载,很不友好,后 ...
- Android利用Http下载文件
Android利用Http下载文件 一.场景 下载存文本文件和下载如mp3等大容量的文件 界面 二.代码编写 1.AndroidMainfest.xml中配置 主要是解决网络权限和写SDCard的权限 ...
- .net中下载文件的方法(转)
.net中下载文件的方法 一.//TransmitFile实现下载 protected void Button1_Click(object sender, EventArgs e) ...
- Javaweb向服务器上传文件以及从服务器下载文件的方法
先导入jar包 点击下载 commons-fileupload是Apache开发的一款专门用来处理上传的工具,它的作用就是可以从request对象中解析出,用户发送的请求参数和上传文件的流. comm ...
- 教你如何在 Android 使用多线程下载文件
# 教你如何在 Android 使用多线程下载文件 前言 在 Android 日常开发中,我们会经常遇到下载文件需求,这里我们也可以用系统自带的 api DownloadManager 来解决这个问题 ...
- linux 从百度网盘下载文件的方法
linux 从百度网盘下载文件的方法 发表于2015 年 月 日由shenwang 方法1.wget wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括 ...
- android intent打开各种文件的方法
android intent打开各种文件的方法 1./** * 检测是否安装了某个软件 * * @param pkgName "com.bill99.kuaishua" ...
- Unity3d C# Socket 下载文件 (同步到)
续篇 Unity3d C# HttpWebRequest 异步下载文件 ,由于project编译为IL2CPP的情况下仍然无效.提示HttpWebrequest 在当前版本号不支持.所以还是寻求其他的 ...
- android NDK的下载-文件太大
需要FQ,建议使用VPN,下载前准备点时间配置网络环境.我的百度网盘好像有~~不过忘记地址了,改天共享,或者私聊我. 2015.4 Android 5.1 Android Studio https:/ ...
随机推荐
- Linux下图解minicom安装
Linux下图解minicom安装 minicom是一个串口通信工具,就像Windows下的HyperTerminal.可用来与串口设备通信,如调试交换机和Modem等.它的Ubuntu软件包的名称就 ...
- 打包,VS 之 InstallShield Limited Edition for Visual Studio 2015 图文教程
转载收藏于 https://www.cnblogs.com/xinaixia/p/5473815.html 从Visual Studio 2012开始,微软就把自家原来的安装与部署工具彻底废掉了,转而 ...
- vue中eventbus的使用
eventbus的方法很是简单,我们需要做三步事情: 第一步,我们需要创造一个容器去充当我们的eventbus 第二步,我们需要去抛出,或者说提交我们的事件 第三步,我们去监听我们的那个事件(也许这才 ...
- effective stl读书笔记 & stl里面提供的算法 & emplace & ostream_iterator
加锁和解锁,也可以在构造函数和析构函数里面,自动调用. 相等和等价的关系:等价是用在排序的时候,跟less函数有关. vector,deque,string 要用erase-remove组合:而关联容 ...
- php将数组或字符串写入文件
//将数组保存在文件里 function export_to_file($file, $variable) { $fopen = fopen($file, 'wb'); if (!$fopen) { ...
- js call 和 apply
前言 call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向. call 和 apply二者的作用完全一样,只是接 ...
- 79.QT解决迷宫问题(面向过程与面向对象)
面向过程: 创建一个类继承dialog,mydialog,添加两个变量 #ifndef MYDIALOG_H #define MYDIALOG_H #include <QDialog>&g ...
- 73,QT指针数组实战(指针数组与数组指针)
//指针数组,每一个指针都是一个MainWindow // MainWindow *w[3][4]; // for(int i=0;i<3;i++) // { // for(int j=0;j& ...
- freeMark
1. 什么是freemark Freemaker是一个”模板引擎”,也可以说是一个基于模板技术的生成文本输出的一个通用工具 2.一般的用途: l 能用来生成任意格式的文本:HTML,XML ...
- POJ 2039 Floyd
句意理解题 解释输入好啦: 第一行n个数 m场电影 随后m行 每行的第一个数 代表 有k奶牛在这个电影中出现过 随后k个数 是奶牛的编号 如果两头奶牛在同一个电影中出现过 相互度为1 奶牛们的相互度可 ...