android开发 socket接收图片并保存
逻辑:接收到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();
}
} }
}
android开发 socket接收图片并保存的更多相关文章
- android 开发 解码gif图片,获取每帧bitmap
环境:android 4.3 (注意对于android4.4版本解码出来不正确,除了第一帧正确外,其余的都是显示不同的地方) 通用版本见: android 开发对gif解码(适配android 4 ...
- android 开发 socket发送会有部分乱码,串码,伴随着数据接收不完整
场景: 客户端A.B,A向B发送json字符串后紧接着发送文件,B接收到文件后才返回消息. 环境:android.使用的是原始的write 和read (若使用的是writeUTF不会出现此问题.)需 ...
- Android开发之接收系统广播消息
BroadcastReceiver除了接收用户所发送的广播消息之外.另一个重要的用途:接收系统广播. 假设应用须要在系统特定时刻运行某些操作,就能够通过监听系统广播来实现.Android的大量系统事件 ...
- Android开发--Socket通信
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
- Android开发中Activity状态的保存与恢复
当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具 ...
- 通过socket获取图片并保存
网络操作的相关API gethostbyname/gethostbyaddr/getservbyname struct hostent *gethostbyname(const char *name) ...
- Android开发——内存优化 图片处理
8. 用缓存避免内存泄漏 很常见的一个例子就是图片的三级缓存结构,分别为网络缓存,本地缓存以及内存缓存.在内存缓存逻辑类中,通常会定义这样的集合类. private HashMap<Strin ...
- SOCKET 接收图片
using System;using System.Collections.Generic;using System.Text;using System.Net.Sockets;using Syste ...
- Android开发之将图片文件转化为字节数组字符串,并对其进行Base64编码处理
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, 转载请说明出处. /** * @将图片文件转化为字节数组字符串,并对其进行Base64编码处理 * ...
随机推荐
- java之旅——JDK版本下载
作为一名IT工作者,技术学无止境,最近开始学习java. 学习java就需要安装jdk,直接到官网上下载,总是找不到很好的版本,在资源中找到一个下载jdk的链接,想下载哪个版本都有. http://w ...
- Android之画廊点击内容显示
package com.example.Gallery; import com.example.Gallery.R; import android.os.Bundle; import android. ...
- 另类安装系统——PE工具提取
1. 在当前系统使用安装工具win$man打开,即pe里集成安装工具 2. 选择安装的磁盘或者分区和引导分区 3. 可以默认下一步 4. 不想更改盘符可以默认下一步 5. 最后完成开始安装部署(还需要 ...
- [转]oracle 实现插入自增列
本文转自:http://blog.csdn.net/love_zt_love/article/details/7911104 刚使用oracle,它和sql server 好多地方还是有所不同的,简单 ...
- C#判断奇偶数的函數
// 现代流行的"程序员" public static bool IsOdd(int n) { while (true) { switch (n) { : return true; ...
- iOS开发中遇到的头文件找不到的问题解决办法
有时会遇到莫名其妙的明明有这个文件,但是就是显示头文件找不到,我也是咨询了技术大牛之后知道的这个方法,之后恰巧我一个朋友问我cocoapod加进去之后头文件找不到,我就让他试了下这个方法果然好用,我也 ...
- .net 后台中对html标签按钮跳转后台以及后台简单验证
---------------------------------学霸,学神,大牛,hacker请绕道de分割线-------------------------------------------- ...
- Ubuntu中设置永久的DNS
通过修改: sudo vi /etc/resolvconf/resolv.conf.d/base(这个文件默认是空的) 在里面插入:nameserver 8.8.8.8nameserver 8.8.4 ...
- 完美解决移动Web小于12px文字居中的问题
前几天的一篇博文:移动Web单行文字垂直居中的问题,提到了移动web里小于12px的文字居中异常的问题,最后还是改为12px才近乎解决了问题.但是有时候或许并不是那么乐观,你并不能将原本定为10px的 ...
- [Bootstrap]组件(四)
导航条 移动设备上折叠(可开关),超过规定视口标签时候水平展开模式 依赖插件 注意点:导航条内元素过多或其他原因导致元素内元素宽度过长,会引起折行-->解决:a.减少导航内元素或者减少宽度 b ...