android通过socket上传文件
有两种方式:
-
直接将所有数据安装字节数组发送
-
对象序列化方式
Client1 :
thread方式
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; } } }
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; } }
Client2:
handler方式
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.os.Handler; import android.os.Message; 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; 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(); } } 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:
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(); // 关闭服务器 } }
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(); } } }
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; } }
转载请注明原文链接:https://www.cnblogs.com/itfanr/p/3161192.html
公众号:小弧光黑板报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战