这篇文章主要介绍了Android通过SOCKET下载文件的方法,实例分析了Android使用Socket进行文件传输的技巧,需要的朋友可以参考下
本文实例讲述了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程序设计有所帮助。