Send Image over TCP in android applications

后端 未结 2 1584
面向向阳花
面向向阳花 2020-12-19 16:03

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 serv

相关标签:
2条回答
  • 2020-12-19 16:30

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

    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.

    0 讨论(0)
  • 2020-12-19 16:42

    My code is now working. I'll post the code in case someone finds it helpful

    SERVER

        package com.example.serverlate;
        import java.io.BufferedReader;
        import java.io.ByteArrayOutputStream;
        import java.io.DataInputStream;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        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.util.DisplayMetrics;
        import android.widget.ImageView;
        import android.widget.TextView;
    
        public class ServerLate extends Activity {
    
            private ServerSocket serverSocket;
    
            Handler updateConversationHandler;
    
            Thread serverThread = null;
    
    
            private ImageView imageView;//  private TextView text;
    
            public static final int SERVERPORT = 6000;
    
            @Override
            public void onCreate(Bundle savedInstanceState) {
    
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_server_late);
    
    
                imageView=(ImageView) findViewById(R.id.imageViewServer);//text = (TextView) findViewById(R.id.textView01); 
    
                updateConversationHandler = new Handler();
    
                this.serverThread = new Thread(new ServerThread());
                this.serverThread.start();
    
            }
    
            @Override
            protected void onStop() {
                super.onStop();
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            class ServerThread implements Runnable {
    
                public void run() {
                    Socket socket = null;
                    try {
                        serverSocket = new ServerSocket(SERVERPORT);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    while (!Thread.currentThread().isInterrupted()) {
    
                        try {
    
                            socket = serverSocket.accept();
    
                            CommunicationThread commThread = new CommunicationThread(socket);
                            new Thread(commThread).start();
    
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    
            class CommunicationThread implements Runnable {
    
                private Socket clientSocket;
    
                private DataInputStream input;//private BufferedReader input;       
    
                public CommunicationThread(Socket clientSocket) {
    
                    this.clientSocket = clientSocket;
    
                    try {
    
                        //this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
    
                        InputStream in = this.clientSocket.getInputStream();
                        this.input = new DataInputStream(in);               
    
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
                public void run() {
                    System.out.println("hello");
                    while (!Thread.currentThread().isInterrupted()) {
                        try {
                            byte[] data;//String read = input.readLine();
                            int len= this.input.readInt();                  
                            data = new byte[len];                   
                            if (len > 0) {
                                this.input.readFully(data,0,data.length);
                            }   
                            /*
                            ByteArrayOutputStream out = new ByteArrayOutputStream();
                            byte[] data;
                            int length = 0;
                            while ((length = this.input.read(data))!=-1) {
                                out.write(data,0,length);
                            }
                               data=out.toByteArray();
                            */
    
                            updateConversationHandler.post(new updateUIThread(data));//updateConversationHandler.post(new updateUIThread(read));
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
    
            }
    
            class updateUIThread implements Runnable {
                private byte[] byteArray;//private String msg;
    
                public updateUIThread(byte[] array){    //public updateUIThread(String str) {
                    this.byteArray=array;   //this.msg = str;
                }
    
                @Override
                public void run() { 
                    Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray , 0, byteArray .length);
                    imageView.setImageBitmap(bitmap);//text.setText(text.getText().toString()+"Client Says: "+ msg + "\n");
                }
            }
        }
    

    CLIENT

        package com.example.clientlate;
    
        import java.io.BufferedWriter;
        import java.io.ByteArrayOutputStream;
        import java.io.DataOutputStream;
        import java.io.IOException;
        import java.io.OutputStream;
        import java.io.OutputStreamWriter;
        import java.io.PrintStream;
        import java.io.PrintWriter;
        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.BitmapFactory;
        import android.graphics.Bitmap.CompressFormat;
        import android.graphics.drawable.BitmapDrawable;
        import android.os.Bundle;
        import android.util.DisplayMetrics;
        import android.view.View;
        import android.widget.EditText;
        import android.widget.ImageView;
    
        public class ClientLate 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_client_late);      
    
                new Thread(new ClientThread()).start();
            }
    
            public void onClick(View view) {
                try {           
                    ImageView imageView=(ImageView) findViewById(R.id.imageView1);//EditText et = (EditText) findViewById(R.id.EditText01);
                    Bitmap bmp=((BitmapDrawable)imageView.getDrawable()).getBitmap(); //String str = et.getText().toString();
    
                    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
                    bmp.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos); 
                    byte[] array = bos.toByteArray();
    
                    OutputStream out = socket.getOutputStream(); 
                    DataOutputStream dos = new DataOutputStream(out);
                    dos.writeInt(array.length);
                    dos.write(array, 0, array.length);
    
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
            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();
                    }
    
                }
    
            }
        }
    
    0 讨论(0)
提交回复
热议问题