摘要 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 | package org.lxh.server; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; import java.util.UUID; import org.lxh.util.UploadFile; public class ServerThreadUtil implements Runnable { private static final String DIRPATH = "D:" + File.separator + "mldnfile" + File.separator; // 目录路径 private Socket client = null; private UploadFile upload = null; public ServerThreadUtil(Socket client) { this.client = client; System.out.println("新的客户端连接..."); } @Override public void run() { try { PrintStream out = new PrintStream(this.client.getOutputStream()); ObjectInputStream ois = new ObjectInputStream( client.getInputStream()); // 反序列化 this.upload = (UploadFile) ois.readObject(); // 读取对象 System.out.println("文件标题:" + this.upload.getTitle()); System.out.println("文件类型:" + this.upload.getMimeType()); System.out.println("文件大小:" + this.upload.getContentLength()); out.print(this.saveFile()) ; } catch (Exception e) { e.printStackTrace(); } finally { try { this.client.close(); } catch (IOException e) { e.printStackTrace(); } } } private boolean saveFile() throws Exception { // 负责文件内容的保存 File file = new File(DIRPATH + UUID.randomUUID() + "." + this.upload.getExt()); if (!file.getParentFile().exists()) { file.getParentFile().mkdir(); } OutputStream output = null; try { output = new FileOutputStream(file) ; output.write(this.upload.getContentData()) ; return true ; } catch (Exception e) { throw e; } finally { output.close(); } } } |