[转载]Android通过Socket上传文件
摘要 android通过socket上传文件
目录[-]
思想:
1.直接将所有数据安装字节数组发送
2.对象序列化方式
两种方式:
一、thread方式
Client1 :
-
主界面
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
package org.lxh.demo; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectOutputStream; import java.net.Socket; import org.lxh.util.UploadFile; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MyClientDemo extends Activity { private Button send = null ; private TextView info = null ; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); super .setContentView(R.layout.main); this .send = (Button) super .findViewById(R.id.send); this .info = (TextView) super .findViewById(R.id.info); this .send.setOnClickListener( new SendOnClickListener()); } private class SendOnClickListener implements OnClickListener { @Override public void onClick(View v) { try { final Socket client = new Socket( "192.168.1.114" , 8888 ); BufferedReader buf = new BufferedReader( new InputStreamReader( client.getInputStream())); // 读取返回的数据 new Thread( new Runnable() { @Override public void run() { try { ObjectOutputStream oos = new ObjectOutputStream( client.getOutputStream()); UploadFile myFile = SendOnClickListener. this .getUploadFile(); oos.writeObject(myFile); //写文件对象 oos.close(); } catch (Exception e) { } } }).start(); String result = buf.readLine(); // 接收返回信息 System.out.println( "**************** " + result); if ( "true" .equals(result)) { MyClientDemo. this .info.setText( "操作成功!" ); } else { MyClientDemo. this .info.setText( "操作失败!" ); } buf.close(); client.close(); } catch (Exception e) { e.printStackTrace(); } } private UploadFile getUploadFile() throws Exception { // 包装了传送数据 UploadFile myFile = new UploadFile(); myFile.setTitle( "DISNEY公园" ); // 设置标题 myFile.setMimeType( "image/jpeg" ); // 图片的类型 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + "disney.jpg" ); InputStream input = null ; try { input = new FileInputStream(file); // 从文件中读取 ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte data[] = new byte [ 1024 ]; int len = 0 ; while ((len = input.read(data)) != - 1 ) { bos.write(data, 0 , len); } myFile.setContentData(bos.toByteArray()); myFile.setContentLength(file.length()); myFile.setExt( "jpg" ); } catch (Exception e) { throw e; } finally { input.close(); } return myFile; } } } |
2.序列化文件对象
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
|
package org.lxh.util; import java.io.Serializable; @SuppressWarnings ( "serial" ) public class UploadFile implements Serializable { private String title ; private byte [] contentData ; private String mimeType ; private long contentLength ; private String ext ; public String getTitle() { return title; } public void setTitle(String title) { this .title = title; } public byte [] getContentData() { return contentData; } public void setContentData( byte [] contentData) { this .contentData = contentData; } public String getMimeType() { return mimeType; } public void setMimeType(String mimeType) { this .mimeType = mimeType; } public long getContentLength() { return contentLength; } public void setContentLength( long contentLength) { this .contentLength = contentLength; } public String getExt() { return ext; } public void setExt(String ext) { this .ext = ext; } } |
二、handler方式
Client:
1.主界面
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
|
public class MyClientDemo extends Activity { private Button send = null ; private TextView info = null ; private static final int FINISH = 0 ; private Handler myHandler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what) { case FINISH: String result = msg.obj.toString() ; // 取出数据 if ( "true" .equals(result)) { MyClientDemo. this .info.setText( "操作成功!" ); } else { MyClientDemo. this .info.setText( "操作失败!" ); } break ; } } } ; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); super .setContentView(R.layout.main); this .send = (Button) super .findViewById(R.id.send); this .info = (TextView) super .findViewById(R.id.info); this .send.setOnClickListener( new SendOnClickListener()); } private class SendOnClickListener implements OnClickListener { @Override public void onClick(View v) { try { final Socket client = new Socket( "192.168.1.114" , 8888 ); final BufferedReader buf = new BufferedReader( new InputStreamReader( client.getInputStream())); // 读取返回的数据 new Thread( new Runnable() { @Override public void run() { try { ObjectOutputStream oos = new ObjectOutputStream( client.getOutputStream()); UploadFile myFile = SendOnClickListener. this .getUploadFile(); oos.writeObject(myFile); String str = buf.readLine() ; // 读取数据 oos.close(); Message msg = MyClientDemo. this .myHandler.obtainMessage(FINISH, str); MyClientDemo. this .myHandler.sendMessage(msg) ; buf.close(); client.close(); } catch (Exception e) { e.printStackTrace() ; } } }).start(); } catch (Exception e) { e.printStackTrace(); } } |
2.序列化文件对象
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
|
private UploadFile getUploadFile() throws Exception { // 包装了传送数据 UploadFile myFile = new UploadFile(); myFile.setTitle( "DISNEY公园" ); // 设置标题 myFile.setMimeType( "image/jpeg" ); // 图片的类型 File file = new File(Environment.getExternalStorageDirectory() .toString() + File.separator + "disney.jpg" ); InputStream input = null ; try { input = new FileInputStream(file); // 从文件中读取 ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte data[] = new byte [ 1024 ]; int len = 0 ; while ((len = input.read(data)) != - 1 ) { bos.write(data, 0 , len); } myFile.setContentData(bos.toByteArray()); myFile.setContentLength(file.length()); myFile.setExt( "jpg" ); } catch (Exception e) { throw e; } finally { input.close(); } return myFile; } } } |
server端
1
2
3
4
5
6
7
8
9
10
11
12
|
package org.lxh.server; import java.net.ServerSocket; public class MyServer { public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket( 8888 ); // 服务器端端口 boolean flag = true ; // 定义标记,可以一直死循环 while (flag) { // 通过标记判断循环 new Thread( new ServerThreadUtil(server.accept())).start(); // 启动线程 } server.close(); // 关闭服务器 } } |
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
|
|