在Android应用程序中通过TCP发送图像 [英] Send Image over TCP in android applications

查看:74
本文介绍了在Android应用程序中通过TCP发送图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使两个使用TCP协议连接的android应用程序. 客户端有一个imageView,当您按下按钮时,它应该将该图像发送到服务器,并且在服务器读取它之后,假设要显示该图像. 但我无法在服务器中显示已发送的图像. 有人可以帮我吗?

I'm trying to make two android applications connected with TCP protocol. Client has an imageView and when you push the button, it is supposed to send that image to the server and after server reads it, it is suppose to display the image. but I haven't been able to display the sent image in server. somebody could please give me a hand?

这是我的服务器代码,可以识别图像,并且可以显示它

THIS IS MY SERVER CODE THAT GETS THE IMAGE AND IT IS SUPPOSE TO DISPLAY IT

        package com.example.simpleserver;

    import java.io.DataInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;

    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.widget.ImageView;
    import android.widget.TextView;

     public class SimpleServer extends Activity {
       ServerSocket ss = null;
       Thread myCommsThread = null;
       protected static final int MSG_ID = 0x1337;
       public static final int SERVERPORT = 6000;
       private Bitmap bitmap;

       @Override
      public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_simple_server);
       TextView tv = (TextView) findViewById(R.id.textView01);
       tv.setText("Nothing from client yet");
       this.myCommsThread = new Thread(new CommsThread());
       this.myCommsThread.start();
       }

       @Override
       protected void onStop() {
       super.onStop();
       try {
            // make sure you close the socket upon exiting
           ss.close();
        } catch (IOException e) {
           e.printStackTrace();
        }
       }

       Handler myUpdateHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_ID:
                     ImageView tv = (ImageView) findViewById(R.id.imageViewServer);
                     tv.setImageBitmap(bitmap);
                     break;
                   default:
                       break;
                   }
             super.handleMessage(msg);
         }
      };
       class CommsThread implements Runnable {
        public void run() {
           Socket s = null;
            try {
            ss = new ServerSocket(SERVERPORT );
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (!Thread.currentThread().isInterrupted()) {
            Message m = new Message();
            m.what = MSG_ID;

            try {
                if (s == null)
                    s = ss.accept();
                InputStream in = s.getInputStream();
                DataInputStream dis = new DataInputStream(in);

                int len = dis.readInt();
                byte[] data = new byte[len];
                if (len > 0) {
                    dis.readFully(data);
                }
                bitmap = BitmapFactory.decodeByteArray(data , 0, data .length);
                myUpdateHandler.sendMessage(m);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    }
    }

这是我发送图像的客户代码

AND THIS IS MY CLIENT CODE THAT SENDS THE IMAGE

        package com.example.simpleclient;

    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.nio.ByteBuffer;

    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.drawable.BitmapDrawable;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageView;

    public class SimpleClient extends Activity {

        private Socket socket;

        private static final int SERVERPORT = 5000;
        private static final String SERVER_IP = "10.0.2.2";

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_simple_client);        
            new Thread(new ClientThread()).start();
        }

        public void onClick(View view) {
            try {;
                getBytes();

            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public void getBytes() throws IOException{
            ImageView iv=(ImageView)findViewById(R.id.imageView1);
            //convert the image to bitmap to be send in the intent
            Bitmap bmp=((BitmapDrawable)iv.getDrawable()).getBitmap();
            int bytes = bmp.getByteCount();
            ByteBuffer buffer = ByteBuffer.allocate(bytes); //Create a new buffer
            bmp.copyPixelsToBuffer(buffer); //Move the byte data to the buffer

            byte[] array = buffer.array(); 
            int start=0;
            int len=array.length;
            if (len < 0)
                throw new IllegalArgumentException("Negative length not allowed");
            if (start < 0 || start >= array.length)
                throw new IndexOutOfBoundsException("Out of bounds: " + start);

            OutputStream out = socket.getOutputStream(); 
            DataOutputStream dos = new DataOutputStream(out);

            dos.writeInt(len);
            if (len > 0) {
                dos.write(array, start, len);
            }

        }

        class ClientThread implements Runnable {

            @Override
            public void run() {

                try {
                    InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

                    socket = new Socket(serverAddr, SERVERPORT);

                } catch (UnknownHostException e1) {
                    e1.printStackTrace();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }

            }

        }
    }

推荐答案

尝试以下代码将图像放入字节数组:

Try the following code to put your image in a byte array:

     ImageView iv=(ImageView)findViewById(R.id.imageView);
     Bitmap bmp=((BitmapDrawable)iv.getDrawable()).getBitmap();

     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
     byte array [] = baos.toByteArray();

此外,我必须指出您在主线程上执行getBytes().仅在较旧的Android版本中才有可能.最好将其放入您的线程中.

Further I must remark that you execute getBytes() on the main thread. This is only possible in older Android versions. Better put it in your thread.

这篇关于在Android应用程序中通过TCP发送图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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