Android Socket 实现批量图片传输

        实现的原理其实也不难,苦于网上没有现成的例子,所以就自己实现了一个。就是在socket 进行图片数据传输的时候,自己去构建一个数据头header ,然后另外一端在读取数据的时候,以这个数据头"start-xxxx"为依据实现image 图像的byte 数据读取。然后解析出来。本例子是实现1s 发送一次read 请求。 


package com.example.zhouyong0701.socketcommtest;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btnServer;
    private Button btnClient;

    private Socket mClient;
    private ServerSocket mServer;
    private Bitmap mBitmap;
    private Handler mHander = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == 0x123) {
                ((ImageView)findViewById(R.id.image)).setImageBitmap(mBitmap);
            }
            super.handleMessage(msg);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnServer = (Button) findViewById(R.id.server);
        btnClient = (Button) findViewById(R.id.client);
        btnServer.setOnClickListener(this);
        btnClient.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.server) {
            Log.d("zhouyong","server button is click ....");
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        mServer = new ServerSocket(5800);
                        Log.d("zhouyong","server is waiting ....");
                        Socket socket = mServer.accept();
                        InputStream in = socket.getInputStream();
                        DataInputStream din = new DataInputStream(in);
                        OutputStream outputStream = socket.getOutputStream();
                        Log.d("zhouyong", "server is connected ....");
                        while(true) {
                            Log.d("zhouyong", "server send cmd ....");
                            outputStream.write("read\n".getBytes());
                            outputStream.flush();
                            int imagesize = 0;
                            if (socket.isConnected()) {
                                Log.d("zhouyong", "server read start ....");
                                //image data header
                                byte[] header = new byte[14];
                                int len;
                                while((len = din.read(header,0,header.length)) > 0) {
                                    String str = new String(header);
                                    if(str.startsWith("start")) {
                                        imagesize = Integer.parseInt(str.split("-")[1]);
                                        Log.d("zhouyong", "server header str = " + str +" size = "+imagesize);
                                        break;
                                    }
                                }
                                byte[] data = new byte[imagesize];
                                len = din.read(data,0,data.length);
                                Log.d("zhouyong", "server read successs size = "+len);
                                if(len > 0 ){
                                    mBitmap = BitmapFactory.decodeByteArray(data,0,data.length);
                                    mHander.sendEmptyMessage(0x123);
                                }
                            }
                            Thread.sleep(1000);
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        } else {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        mClient = new Socket("127.0.0.1", 5800);
                        Log.d("zhouyong","connected ...");
                        OutputStream out = mClient.getOutputStream();
                        DataOutputStream dout = new DataOutputStream(out);
                        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(mClient.getInputStream()));
                        String cmd;
                        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test1);
                        Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.test2);
                        boolean flag = true;
                        while (true) {
                            cmd = bufferedReader.readLine();
                            Log.d("zhouyong","client cmd = "+cmd);
                            if ("read".equals(cmd)) {
                                ByteArrayOutputStream bout = new ByteArrayOutputStream();
                                if(flag) {
                                    bitmap.compress(Bitmap.CompressFormat.JPEG, 20, bout);
                                } else {
                                    bitmap1.compress(Bitmap.CompressFormat.JPEG, 20, bout);
                                }
                                bout.flush();
                                Log.d("zhouyong", "send cap jpg ...bout.size() = " + bout.size());
                                int size = bout.size();
                                String header = String.format("start-%08d",size);
                                Log.d("zhouyong","header = "+header+" size = "+header.getBytes().length);
                                dout.write(header.getBytes());
                                dout.write(bout.toByteArray());
                                dout.flush();
                                flag = !flag;
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值