[转载]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
|
|
浙公网安备 33010602011771号