android开发 socket接收图片并保存
2023-09-11 14:18:38 时间
逻辑:接收到socket之后需要将socket发送的图片数据保存下来并通知handler更新界面
关键代码:
public void readImage(Socket socket) { try { InputStream in = socket.getInputStream(); BufferedInputStream bis = new BufferedInputStream(in); Bitmap bitmap = BitmapFactory.decodeStream(bis);//这个好像是android里的 //首先看看文件是否存在 File f = new File(mfilePath); File bmpFile = new File(mfilePath, "screen.png"); if (!f.exists()) { f.mkdirs(); } if (bmpFile.exists()) { bmpFile.delete(); } FileOutputStream out = new FileOutputStream(bmpFile); bitmap.compress(Bitmap.CompressFormat.PNG, 100,out); bis.close(); in.close(); } catch(Exception ex) { Log.v(TAG, ex.getMessage()); } finally { Message msg = new Message(); msg.what = 1; //说明有图片更新 mHandler.sendMessage(msg); Log.v(TAG, "接收到图片,准备handler消息更新界面"); release(); } }
服务器端socket接收所有代码:
import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; import android.util.Log; /** * 服务器端完整socket接收代码(接收客户端的图片) * @author huqiang * */ public class SocketService implements Runnable{ private static final String TAG = "SZU_TcpService"; private ServerSocket serviceSocket; private boolean SCAN_FLAG = false; // 接收扫描标识 private boolean REV_FLAG = false; // 接收标识 private static String mfilePath = null; // 存放接收文件的路径 private static Context mContext; private static SocketService instance; // 唯一实例 private Thread mThread; private boolean IS_THREAD_STOP = false; // 是否线程开始标志 private static Handler mHandler; public SocketService() { try { serviceSocket = new ServerSocket(4700); Log.d(TAG, "建立监听服务器ServerSocket成功"); } catch (IOException e) { Log.d(TAG, "建立监听服务器ServerSocket失败"); e.printStackTrace(); } mThread = new Thread(this); } /** * <p> * 获取TcpService实例 * <p> * 单例模式,返回唯一实例 */ public static SocketService getInstance(Context context,Handler handler,String filepath) { mContext = context; mHandler = handler; mfilePath = filepath; if (instance == null) { instance = new SocketService(); } return instance; } public void setSavePath(String fileSavePath) { Log.d(TAG, "设置存储路径成功,路径为" + fileSavePath); this.mfilePath = fileSavePath; // REV_FLAG=true; } public SocketService(Context context) { this(); mContext = context; } private void scan_recv() { try { Socket socket = serviceSocket.accept(); // 接收UDP数据报 // socket.setSoTimeout(10*1000); // 设置掉线时间 Log.d(TAG, "客户端连接成功"); //通过子线程来循环读取socket的消息 ListenClientSocket ls = new ListenClientSocket(socket); ls.start(); } catch (IOException e) { e.printStackTrace(); Log.d(TAG, "客户端连接失败"); SCAN_FLAG = false; } } @Override public void run() { Log.d(TAG, "TCP_Service线程开启"); while (!IS_THREAD_STOP) { if (SCAN_FLAG) { scan_recv(); } } } public void release() { if (null != serviceSocket && !serviceSocket.isClosed()) try { serviceSocket.close(); serviceSocket = null; Log.d(TAG, "关闭socket成功"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } while (SCAN_FLAG == true) ;// 直到SCAN_FLAG为false的时候退出循环 SCAN_FLAG = false; IS_THREAD_STOP = true; } public void startReceive() { SCAN_FLAG = true; // 使能扫描接收标识 if (!mThread.isAlive()) mThread.start(); // 开启线程 } public void stopReceive() { while (SCAN_FLAG == true) ; SCAN_FLAG = false; // 失能扫描接收标识 } /** * 监听客户端发送的消息 * @author huqiang * */ class ListenClientSocket implements Runnable { private boolean IsListening = false; private Socket clientSocket; private Thread thread; public ListenClientSocket(Socket s) { this.clientSocket = s; this.thread = new Thread(this); } @Override public void run() { while(clientSocket!=null&&!clientSocket.isClosed()&&IsListening) { readImage(this.clientSocket); } } public void start() { IsListening = true; thread.start(); } public void release() { IsListening = false; if(!clientSocket.isClosed()) { try { clientSocket.close(); clientSocket = null; } catch (IOException e) { e.printStackTrace(); } } } public void readImage(Socket socket) { try { InputStream in = socket.getInputStream(); BufferedInputStream bis = new BufferedInputStream(in); Bitmap bitmap = BitmapFactory.decodeStream(bis);//这个好像是android里的 //首先看看文件是否存在 File f = new File(mfilePath); File bmpFile = new File(mfilePath, "screen.png"); if (!f.exists()) { f.mkdirs(); } if (bmpFile.exists()) { bmpFile.delete(); } FileOutputStream out = new FileOutputStream(bmpFile); bitmap.compress(Bitmap.CompressFormat.PNG, 100,out); bis.close(); in.close(); } catch(Exception ex) { Log.v(TAG, ex.getMessage()); } finally { Message msg = new Message(); msg.what = 1; //说明有图片更新 mHandler.sendMessage(msg); Log.v(TAG, "接收到图片,准备handler消息更新界面"); release(); } } } }
相关文章
- Nexus 7 平板已经可升级到 Android 4.2
- Android开发之搜芽项目的图片加载问题(使用Volley进行网络图片加载)
- 【Android】Android中WIFI开发总结(一)
- android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果
- Android开发之旅:android架构
- Android开发学习---使用Intelij idea 13.1 进行android 开发
- android开发学习---基础知识学习、如何导入已有项目和开发一个电话拨号器
- Android基于XMPP Smack openfire 开发的聊天室
- 《android开发艺术探索》读书笔记(十一)--Android的线程和线程池
- 【ANDROID游戏开发之一】设置全屏以及绘画简单的图形
- 【ANDROID游戏开发十六】ANDROID GESTURE之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- 【ANDROID游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SURFACEVIEW中用重力传感器控制圆球的各方向移动)
- Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片
- Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制
- 《android开发艺术探索》读书笔记(十五)--Android性能优化
- 《android开发艺术探索》读书笔记(十一)--Android的线程和线程池
- Android GIS开发系列-- 入门季(6)GraphicsLayer添加文字与图片标签
- Android android studio 项目放在源码中编译
- Flutter之Pigeon插件与Android通信使用指南
- 2014 android毕设代做 代做Android毕设 安卓毕设
- 让APP不被android系统杀掉
- Android开发之多线程编程Thread和Runnable使用
- Android Studio一直 Fetching Documentation...
- Android智能穿戴设备开发从入门到精通
- Android开发之利用MediaCodec 获取视频的sps pps 和视频数据
- android开发,Android Studio在创建安卓虚拟设备(AVD)时,报错:Unknown Error