Android-从C#服务器通过套接字接收映像(几乎完成) [英] Android - Receving an Image over the Socket from C# Server (Almost Complete)

查看:72
本文介绍了Android-从C#服务器通过套接字接收映像(几乎完成)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在服务器上每秒发送x次图像(基本上是视频流).

I'm sending an image (it's basically a video stream) x times per second on my server.

master.frame_drone.Bitmap是图片

C#服务器

 private void send_data()
    {

            string data = "";


            string conetado, bateria, tensao, altitude, roll, pitch, yaw, velx, vely, velz, estado, atual, desejado;
            string conetado2, bateria2, tensao2, altitude2, roll2, pitch2, yaw2, velx2, vely2, velz2, estado2, atual2, desejado2;

            conetado = master.sconetado;
            bateria = master.sbateria;
            tensao = master.stensao;
            altitude = master.saltitude;
            roll = master.sroll;
            pitch = master.spitch;
            yaw = master.syaw;
            velx = master.svelx;
            vely = master.svely;
            velz = master.svelz;
            estado = master.sestado;
            atual = master.satual;
            desejado = master.sdesejado;


            conetado2 = slave.sconetado;
            bateria2 = slave.sbateria;
            tensao2 = slave.stensao;
            altitude2 = slave.saltitude;
            roll2 = slave.sroll;
            pitch2 = slave.spitch;
            yaw2 = slave.syaw;
            velx2 = slave.svelx;
            vely2 = slave.svely;
            velz2 = slave.svelz;
            estado2 = slave.sestado;
            atual2 = slave.satual;
            desejado2 = slave.sdesejado;


            ImageConverter converter = new ImageConverter();
            byte[] sendBytes = (byte[])converter.ConvertTo(master.frame_drone.Bitmap, typeof(byte[]));

            string_master_frame = Convert.ToBase64String(sendBytes);

            data = conetado + "\n" + bateria + "\n" + tensao + "\n" + altitude + "\n" + roll + "\n" + pitch + "\n" + yaw + "\n" + velx + "\n" + vely + "\n" + velz + "\n" + estado + "\n" + atual + "\n" + desejado + "\n" +
                        conetado2 + "\n" + bateria2 + "\n" + tensao2 + "\n" + altitude2 + "\n" + roll2 + "\n" + pitch2 + "\n" + yaw2 + "\n" + velx2 + "\n" + vely2 + "\n" + velz2 + "\n" + estado2 + "\n" + atual2 + "\n" + desejado2 + "\n" + string_master_frame + "\n";

            tcpServer1.Send(data);


    }

所以我从服务器上得到了一个字符串,它基本上是图像.

So I get a string from the server that it's basically the image.

Android客户端

Android Client

 protected Void doInBackground(Void... arg0) {


        Socket socket = null;

        try {
            socket = new Socket(dstAddress, dstPort);

            while(true) {
                Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));

     /*
      * notice: inputStream.read() will block if no data return
      */
                //MASTER
                valores[0] = r.nextLine();
                valores[1] = r.nextLine();
                valores[2] = r.nextLine();
                valores[3] = r.nextLine();
                valores[4] = r.nextLine();
                valores[5] = r.nextLine();
                valores[6] = r.nextLine();
                valores[7] = r.nextLine();
                valores[8] = r.nextLine();
                valores[9] = r.nextLine();
                valores[10] = r.nextLine();
                valores[11] = r.nextLine();
                valores[12] = r.nextLine();

                //SLAVE
                valores[13] = r.nextLine();
                valores[14] = r.nextLine();
                valores[15] = r.nextLine();
                valores[16] = r.nextLine();
                valores[17] = r.nextLine();
                valores[18] = r.nextLine();
                valores[19] = r.nextLine();
                valores[20] = r.nextLine();
                valores[21] = r.nextLine();
                valores[22] = r.nextLine();
                valores[23] = r.nextLine();
                valores[24] = r.nextLine();
                valores[25] = r.nextLine();

                valores[26] = r.nextLine();


                publishProgress(valores[0],valores[1],valores[2],valores[3],valores[4],valores[5],valores[6],valores[7],valores[8],valores[9],valores[10],valores[11],valores[12],
                        valores[13],valores[14],valores[15],valores[16],valores[17],valores[18],valores[19],valores[20],valores[21],valores[22],valores[23],valores[24],valores[25],valores[26]);
            }

@Override
protected void onProgressUpdate(String... values) {
    super.onProgressUpdate(values);
    conetado.setText(values[0]);
    bateria.setText(values[1]);
    tensao.setText(values[2]);
    altitude.setText(values[3]);
    roll.setText(values[4]);
    pitch.setText(values[5]);
    yaw.setText(values[6]);
    velx.setText(values[7]);
    vely.setText(values[8]);
    velz.setText(values[9]);
    estado.setText(values[10]);
    atual.setText(values[11]);
    desejado.setText(values[12]);

    conetado2.setText(values[13]);
    bateria2.setText(values[14]);
    tensao2.setText(values[15]);
    altitude2.setText(values[16]);
    roll2.setText(values[17]);
    pitch2.setText(values[18]);
    yaw2.setText(values[19]);
    velx2.setText(values[20]);
    vely2.setText(values[21]);
    velz2.setText(values[22]);
    estado2.setText(values[23]);
    atual2.setText(values[24]);
    desejado2.setText(values[25]);

    Bitmap master_bitmap = BitmapFactory.decodeByteArray(values[26].getBytes(),0,values[26].length());
    master_frame.setImageBitmap(master_bitmap);

}

}

我的问题是我使用\n逐行读取字符串,所有TextViews都运行良好,但是当我引入字符串valores[26]时,所有内容开始去同步,并且所有值混合在一起,例如:现在获取valores[26]的一些数据,等等...

My problem is that I read the strings line by line using \n all the TextViews were working well but when I introduce the string valores[26] everything starts desyncronizing and all the values get mixed, for example: valores[0] now gets some of the data of valores[26], etc...

如何从服务器获取字符串并将其显示在ImageView上?

How can I get the string from the server and display it on a ImageView?

Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));
while(true) {

有效.现在数据不混合了.最后一个问题:

Worked. Now the data doesnt mix. One last question:

在我的onProgressUpdate内部,我尝试对字符串进行解码,但没有成功.

Inside my onProgressUpdate i tried to decode the string and didnt work.

    byte[] decodedString = Base64.decode(values[26],Base64.DEFAULT);
    Bitmap master_bitmap = BitmapFactory.decodeByteArray(decodedString,0,decodedString.length);
    master_frame.setImageBitmap(master_bitmap);

进程:com.example.tiago.java_android,PID:3510 java.lang.IllegalArgumentException:错误的base-64 在android.util.Base64.decode(Base64.java:161) 在android.util.Base64.decode(Base64.java:136) 在android.util.Base64.decode(Base64.java:118)

Process: com.example.tiago.java_android, PID: 3510 java.lang.IllegalArgumentException: bad base-64 at android.util.Base64.decode(Base64.java:161) at android.util.Base64.decode(Base64.java:136) at android.util.Base64.decode(Base64.java:118)

推荐答案

     while(true) {
            Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));

将其更改为:

    Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));

    while(true) {

这篇关于Android-从C#服务器通过套接字接收映像(几乎完成)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆