逻辑:接收到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接收图片并保存的更多相关文章

  1. android 开发 解码gif图片,获取每帧bitmap

    环境:android 4.3  (注意对于android4.4版本解码出来不正确,除了第一帧正确外,其余的都是显示不同的地方)  通用版本见: android 开发对gif解码(适配android 4 ...

  2. android 开发 socket发送会有部分乱码,串码,伴随着数据接收不完整

    场景: 客户端A.B,A向B发送json字符串后紧接着发送文件,B接收到文件后才返回消息. 环境:android.使用的是原始的write 和read (若使用的是writeUTF不会出现此问题.)需 ...

  3. Android开发之接收系统广播消息

    BroadcastReceiver除了接收用户所发送的广播消息之外.另一个重要的用途:接收系统广播. 假设应用须要在系统特定时刻运行某些操作,就能够通过监听系统广播来实现.Android的大量系统事件 ...

  4. Android开发--Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

  5. Android开发中Activity状态的保存与恢复

    当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具 ...

  6. 通过socket获取图片并保存

    网络操作的相关API gethostbyname/gethostbyaddr/getservbyname struct hostent *gethostbyname(const char *name) ...

  7. Android开发——内存优化 图片处理

    8.  用缓存避免内存泄漏 很常见的一个例子就是图片的三级缓存结构,分别为网络缓存,本地缓存以及内存缓存.在内存缓存逻辑类中,通常会定义这样的集合类. private HashMap<Strin ...

  8. SOCKET 接收图片

    using System;using System.Collections.Generic;using System.Text;using System.Net.Sockets;using Syste ...

  9. Android开发之将图片文件转化为字节数组字符串,并对其进行Base64编码处理

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, 转载请说明出处. /** * @将图片文件转化为字节数组字符串,并对其进行Base64编码处理 * ...

随机推荐

  1. 修改jar中的class文件

    在工作中有可能会遇到需要修改jar的情况.正常情况下,如果有源代码的话,就比较容易,直接修改源代码,再导出新的jar文件即可.但是如果没有源代码就比较麻烦了,下面记录了没有源代码的情况修改jar的方法 ...

  2. asp.net全局记住值

    每个网页都要记住名字和密码! 在Page_Load中写如下代码: Session[“起个名字”]=要赋值的; 在显示的时候写 Response.write(Session[“当时起的名字”.ToStr ...

  3. VxWorks 6.9 内核编程指导之读书笔记 -- 多任务(二)

    VxWorks的系统任务 VxWorks在引导时启动的系统任务依赖于配置,有些总是运行.任务集与VxWorks的基本配置相关,很少的任务常用于可选的组件. 注意:别挂起.删除或改变任何系统任务的优先级 ...

  4. AMQ学习笔记 - 18. 持久化的测试

    概述 对持久化的有效性进行测试. 测试实例 测试实例 结果预测 持久化递送 重启ActiveMQ后,消息还在队列中 非持久化递送 重启ActiveMQ后,消息不在队列中 demo设计 jms-prod ...

  5. WCF之错误和异常

    CLR异常无法跨越服务边界,所有的异常都被封装(序列化)为SOAP Fault,可以让所有平台的用户接收到. SOAP1.1只有Body.1.2中含有Header+Body. 未捕获异常 异常会从逻辑 ...

  6. java与C#用protobuf通信--java如何转换protobuf-net中的bcl.Decimal对象

    公司内部有些C#服务使用proto-net,引入了bcl.proto中的bcl.Decimal.bcl.DateTime等.对于java的proto生成代码需要对bcl.Decimal.bcl.Dat ...

  7. android 网络_网络图片查看器

    xml <?xml version="1.0"?> -<LinearLayout tools:context=".MainActivity" ...

  8. Android App测试要点

         本文主要内容,转载自 http://www.51testing.com/html/04/344504-849373.html,      在这里,主要是整理一下app测试的总体思路,这里的a ...

  9. 向CodeBlocks的Project中添加calss文件时,出现No such file or directory错误的解决方案

    我们在CodeBlocks中编写程序时,一般要建立工程.现在建立工程first,然后建立类文件Person,并将其添加到first中, int main() { Person p; p.display ...

  10. ADO.NET笔记——使用连接池

    相关知识: 连接池的意义: 应用程序往往涉及大量的,并发的数据访问操作 数据库服务器能够同时维系的连接数量非常有限.如果某个数据库访问操作不及时关闭连接,就会减少其他调用对数据库访问的机会.因此,一般 ...