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();
            }
        }

    }
}
时间: 2024-12-29 11:41:09

android开发 socket接收图片并保存的相关文章

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

BroadcastReceiver除了接收用户所发送的广播消息之外,还有一个重要的用途:接收系统广播.如果应用需要在系统特定时刻执行某些操作,就可以通过监听系统广播来实现.Android的大量系统事件都会对外发送标准广播.以下是Android常见的广播Action常量(详请参考Android API文档中关于Intent的说明). Action常量 说明 ACTION_TIME_CHANGED 系统时间被改变. ACTION_DATE_CHANGED 系统日期被改变. ACTION_TIMEZO

Android开发中根据图片名称获取在drawable中的ID

在Android开发中图片资源是必不可少的,如ImageView需要图片资源的ID,ImageButton需要资源的ID等等,我们可以用R.drawable.XXX可以获取图片资源的ID,但是,在某些时候,这样做很费时,我们想动态的获得资源ID,比如说,我传入一个图片名称的字符串,根据字符串来获得资源的ID这样就很方便了,没错,这样确实很方便,我们如果对图片的名称稍加改动,比如用img1.png,img2.png,img3.png...这样就可以在一个循环之内获得所有的ID,对开发来说少写的就不

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

场景: 客户端A.B,A向B发送json字符串后紧接着发送文件,B接收到文件后才返回消息. 环境:android.使用的是原始的write 和read (若使用的是writeUTF不会出现此问题.)需要个IOS对接 原因:采用连续write方法写数据会出现一起read的情况,数据缓存串乱 解决办法:必须write一次之后read一次,这样才能保证A在read的时候不会在第一次read的时候就读取B第二次write的内容.

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

当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具体用途举个例子:你正在编辑短信,这时候来了一个电话,打完电话回到短信界面, 短信刚好被系统回收重启,这时原先编辑了一半的内容总不能丢失了吧,这样影响用户体验.所以解决办法如下: 1 private static final String INSTANCE_STATUS="instance_statu

Android开发之实现图片自动滚动显示标签的ViewPager

Android中实现图片自动滚动的效果非常的常见,我们可以自己动画去实现功能.但是在Android中提供了一个ViewPager类,实现了滚动效果,在Android的extras目录下android-support-vx.jar中,x代表版本4,7等等.使用时我们需要android.support.v4.view.ViewPager的viewPager标签. 博客来源:http://blog.csdn.net/fengshizty 代码非常的简单,不用解释: xml布局文件如下: <Relati

Android开发socket通信——手机做server端C/S架构实现

每一部智能手机都是一部微型电脑,在学校里最喜欢的就是找上十个八个同学一起局域网内开几局dota,突然想到,拿手机C一个游戏来玩怎样,不用连wifi.不用开数据,几部手机选一个做主机,其他手机连上它的热点,便可以互动起来游戏搞起来了,多开心~~ 实际实现过程中发现拿手机本身做server的手段还真是很少有人使用,网上也很少有现成的解决方案,经过一番摸索,简单实现了手机自身做server(可兼做客户端)的socket通信功能,写出来请大家指导一下,也是简单梳理一下方便日后复用. 遇到的最大问题可能是

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

使用方法: void showGif2() { gifDecoder = new GifImageDecoder(); try { gifDecoder.read(this.getResources().openRawResource(R.drawable.b17)); //这是Gif图片资源 int size =gifDecoder.getFrameCount(); for(int i=0;i<size;i++) { ImageView iv_image = new ImageView(Cus

SOCKET 接收图片

using System;using System.Collections.Generic;using System.Text;using System.Net.Sockets;using System.Net;using System.IO;namespace ConsoleApplication2{  Class Program  {    static void Main (String[] args)    {      // 1. to create a socket      Soc

Android开发之图片处理专题(一):利用软引用构建图片高速缓存

在Android开发中,图片处理是一个难点.对于大量的图片处理,一不小心就会出现OOM的错误.那么,构建缓存,就是非常必要的一个手段.利用软引用构建缓存,只是其中步骤之一,我们来看看一般情况下,图篇处理的流程. 一般而言,图片的处理流程大致如上,之前所说的Xutils的原理,也如此.今天,我们就先讲讲如何利用软引用技术来构建高速缓存. 一.对象的四种引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态