将数据从服务器发送到Android应用

时间:2014-11-28 07:46:57

标签: java android sockets opencv

如何使用套接字从服务器向Android应用程序发送数据以显示它?

我的Android应用会拍摄照片并将其发送到位于PC上的服务器进行存储,然后检测图片中有多少张脸并使用OpenCV对其进行标记。

我想将检测到的服务器面部值和带有标记面部的图像发送到Android应用,分别使用ToastImageView显示。

这是服务器的代码.-

 /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package fileserver;

    /**
     *
     * @author Andrea
     */
    import java.io.BufferedOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import org.opencv.core.Core;
    import org.opencv.core.Mat;
    import org.opencv.core.MatOfRect;
    import org.opencv.core.Point;
    import org.opencv.core.Rect;
    import org.opencv.core.Scalar;
    import org.opencv.highgui.Highgui;
    import org.opencv.objdetect.CascadeClassifier;

    public class FileServer {

        public static void run() {  //byte[] imagen
            System.out.println("\nRunning DetectFaceDemo");

            // Create a face detector from the cascade file in the resources
            // directory.

            /*
            La clase CascadeClasifier se emplea para la detección de objetos.
            Cargamos el archivo claficador .xml para deteccion frontal de rostros.
            */
            CascadeClassifier faceDetector = new CascadeClassifier("C:\\opencv\\sources\\data\\lbpcascades\\lbpcascade_frontalface.xml");
            //CascadeClassifier faceDetector = new CascadeClassifier("C:\\opencv\\sources\\data\\lbpcascades\\haarcascade_frontalface_alt.xml");
            //Mat image = Highgui.imread("C:\\opencv\\shekhar.JPG");
            //Mat image = Highgui.imread("FotoTest1.jpg");

            /*
            La clase Mat almacena valores numéricos de cada punto de la imagen.
            */
            Mat image = Highgui.imread("src/Test.jpg");

            /* 
            Iniciamos la deteccion de rostros en la imagen.
            La clase MatOfRect es una clase contenedora especial para la clase Rect.
            */
            MatOfRect faceDetections = new MatOfRect();
            faceDetector.detectMultiScale(image, faceDetections);

            System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));

            /*
            Dibujamos un rectangulo en cada cara
            */
            for (Rect rect : faceDetections.toArray()) {
                Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
            }

            /*
            Guardamos la nueva imagen con los rostros detectados
            */
            String filename = "faceDetection3.png";
            System.out.println(String.format("Writing %s", filename));
            Highgui.imwrite(filename, image);
        }

        public static void main(String[] args) throws IOException {
            int filesize = 6022386; // filesize temporary hardcoded

            //Indispensable para el funcionamiento de OpenCV
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

            long start = System.currentTimeMillis();
            int bytesRead;
            int current = 0;

            // create socket
            ServerSocket servsock = new ServerSocket(5000);
            while (true) {
                System.out.println("Waiting...");

                Socket sock = servsock.accept();
                System.out.println("Accepted connection : " + sock);

                // receive file
                byte[] mybytearray = new byte[filesize];
                InputStream is = sock.getInputStream();
                FileOutputStream fos = new FileOutputStream("src/Test.jpg"); // destination

                BufferedOutputStream bos = new BufferedOutputStream(fos);
                bytesRead = is.read(mybytearray, 0, mybytearray.length);
                current = bytesRead;

                // thanks to A. Cádiz for the bug fix
                do {
                    bytesRead = is.read(mybytearray, current,
                            (mybytearray.length - current));
                    if (bytesRead >= 0) {
                        current += bytesRead;
                    }
                } while (bytesRead > -1);

                bos.write(mybytearray, 0, current);
                bos.flush();
                long end = System.currentTimeMillis();
                System.out.println(end - start);
                bos.close();

                /*
                Ejecutamos el algoritmo de deteccion de rostros
                */
                run();

                sock.close();
                System.out.println(fos.toString());
            }
        }
    }

Android应用.-

package com.Cardiel.DTO;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.text.SimpleDateFormat;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import android.provider.MediaStore;

public class DTO extends Activity implements OnClickListener {
    private static final String PATTERN = "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
    String ruta_fotos = Environment
            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
            + "/misfotos/";
    String path_file;
    File file = new File(ruta_fotos);
    Button btnCam, btnPrueba, btnEnviar;
    ImageView imagen;
    Intent i;
    Bitmap bmp;
    int cons;
    static final int SERVERPORT = 5000;
    String SERVER_IP;
    Socket cliente;
    DataInputStream input;
    BufferedInputStream bis;
    BufferedOutputStream bos;
    int in;
    byte[] byteArray;

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

        btnCam = (Button) findViewById(R.id.btnn1);
        /*btnPrueba = (Button) findViewById(R.id.btn2);*/
        btnEnviar = (Button) findViewById(R.id.btn3);
        imagen = (ImageView) findViewById(R.id.imageView1);

        /* image size */
        int width = 300, height = 200;
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width,
                height);
        imagen.setLayoutParams(params);

        btnCam.setOnClickListener(this);
        /*btnPrueba.setOnClickListener(this);*/
        btnEnviar.setOnClickListener(this);
        file.mkdir();

    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        switch (v.getId()) {

        case R.id.btnn1:
            path_file = ruta_fotos + getCode() + ".jpg";
            File mi_foto = new File(path_file);

            try {
                mi_foto.createNewFile();
            } catch (IOException ex) {
                Log.e("ERROR ", "Error:" + ex);
            }

            Uri uri = Uri.fromFile(mi_foto);

            i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            i.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            startActivityForResult(i, cons);
            break;

        /*case R.id.btn2:
            bmp = BitmapFactory.decodeResource(getResources(),
                    R.drawable.prueba);
            imagen.setImageBitmap(bmp);
            imagen.setEnabled(false);
            break;*/

        case R.id.btn3:
            if (imagen.isEnabled() == false) {
                hacerDialog();
            } else {
                Toast.makeText(this, "No se ha Seleccionado una imagen",
                        Toast.LENGTH_LONG).show();
            }
        }

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (resultCode) {
        case Activity.RESULT_OK:

            bmp = readingImage(path_file);

            if (bmp != null) {
                imagen.setImageBitmap(bmp);
                imagen.setEnabled(false);
            }

            break;

        case Activity.RESULT_CANCELED:

            break;
        }
    }

    public String getCode() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");
        String date = dateFormat.format(new Date());
        String photoCode = "pic_" + date;

        return photoCode;
    }

    private Bitmap readingImage(String _path) {
        Bitmap bitmap = null;
        File f = new File(_path);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;

        try {
            bitmap = BitmapFactory.decodeStream(new FileInputStream(f), null,
                    options);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        return bitmap;
    }

    public void hacerDialog() {
        AlertDialog.Builder alert = new AlertDialog.Builder(this);

        alert.setTitle("Ingrese IP");
        alert.setMessage("Direccion IP del Servidor");

        // Set an EditText view to get user input
        final EditText input = new EditText(this);
        alert.setView(input);

        alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                boolean isIP = validate(input.getText().toString());
                if (isIP == true) {
                    SERVER_IP = input.getText().toString();
                    (new MySyncTask()).execute();
                } else {
                    Toast.makeText(DTO.this, "IP no es Valida",
                            Toast.LENGTH_LONG).show();
                }

            }
        });

        alert.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        // Canceled.
                    }
                });

        alert.show();
    }

    public static boolean validate(final String ip) {

        Pattern pattern = Pattern.compile(PATTERN);
        Matcher matcher = pattern.matcher(ip);
        return matcher.matches();
    }

    class MySyncTask extends AsyncTask<Integer, Integer, String> {

        @Override
        protected String doInBackground(Integer... params) {

            try {
                cliente = new Socket(SERVER_IP, SERVERPORT);

                // Enviar archivo
                File myFile = new File(path_file);
                byte[] mybytearray = new byte[(int) myFile.length()];
                FileInputStream fis = new FileInputStream(myFile);
                BufferedInputStream bis = new BufferedInputStream(fis);
                bis.read(mybytearray, 0, mybytearray.length);
                OutputStream os = cliente.getOutputStream();
                // System.out.println("Sending...");
                os.write(mybytearray, 0, mybytearray.length);
                os.flush();

                fis.close();

                cliente.close();

            } catch (UnknownHostException e) {
                Log.v("ERROR", e.toString());
            } catch (IOException e) {
                Log.v("ERROR", e.toString());
            }

            return null;
        }
    }
}

这是.xml layout.manifest

我会感激任何帮助。感谢。

1 个答案:

答案 0 :(得分:0)

将结果写入服务器的同一个套接字,并从Android套接字中读取它们......

output.write(yourimage); // write prepareServer message to the server // here I use an object.. you, use your method.
    in = new ObjectInputStream(connection.getInputStream()); // get inputstream to read from the server!
    newMessageArrived = new incomming((int) transferr.length()); // Define new message object
    if ((newMessageArrived = (incomming) in.readUnshared()) != null) { // try to read result from server
    //... do ur stuff..
    }