本文实例讲述了Android通过SOCKET下载文件的方法。分享给大家供大家参考,具体如下:
服务端代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
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 = 2012 ;
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 [ 8192 ];
DataOutputStream ps = new DataOutputStream(out);
ps.writeLong(( long ) f.length()); //发送文件大小
ps.flush();
while ( true ) {
int read = 0 ;
if (dis!= null ){
read = fis.read(buffer);
}
if (read == - 1 ){
break ;
}
ps.write(buffer, 0 ,read);
}
ps.flush();
dis.close();
s.close();
out.flush();
break ;
}
}
} catch (IOException e){
e.printStackTrace();
}
}
}
}
|
客户端代码,下载线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
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() - 1 ;
System.out.println( "开始下载" );
byte [] buffer = new byte [ 8192 ];
while ( true ) {
int read = 0 ;
if (dis != null ) {
read = dis.read(buffer);
downLoadFileSize += read;
}
if (read == - 1 ) {
break ;
}
dos.write(buffer, 0 , 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程序设计有所帮助。