簡體   English   中英

Android:麻煩通過套接字發送位圖字節數組

[英]Android: trouble to send bitmap byte array over socket

關於我的最后一個問題 ,我現在很難將Bitmap字節數組發送到服務器端。

關於此項目示例的小解釋(與我之前的問題相同):

服務器向客戶端.apk發送請求截屏的字符串命令,然后如果客戶端接收到此特定字符串,則客戶端將執行下面我的getBytes()代碼中調用的方法,該方法負責:將設備的截屏捕獲為Bitmap ,將此位圖轉換為字節數組,使用ZLIB庫壓縮此字節數組,最后將此壓縮后的字節數組發送到服務器端。

顯然一切似乎還可以,但是服務器端什么也沒收到。

package com.example.client;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.zip.Deflater;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import android.app.Activity;
import android.graphics.Bitmap;

public class MainActivity extends Activity {

    Socket clientSocket;

    private static final int SERVERPORT = 60;
    private static final String SERVER_IP = "192.168.25.227";

    byte[] tmpbytes = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(new ClientThread()).start();

    }

        public Bitmap takeScreenshot() {

           View rootView = findViewById(android.R.id.content).getRootView();
           rootView.setDrawingCacheEnabled(true);
           return rootView.getDrawingCache();

        }

        ///////////////////////  ZLIB compression library. ////////////////////////////////

        public static byte[] compress(byte[] data) throws IOException {  

               Deflater deflater = new Deflater();  
               deflater.setInput(data);  
               ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);   
               deflater.finish();  
               byte[] buffer = new byte[1024];   
               while (!deflater.finished()) {  
                int count = deflater.deflate(buffer);   
                outputStream.write(buffer, 0, count);   
               }  
               outputStream.close();  
               byte[] output = outputStream.toByteArray();  

               return output;

              }  

        /////////////////////////////////////////////////////////////////////////////////

        public void getBytes() throws IOException {

            try
            {

            Bitmap bitmap = takeScreenshot();


            int bytes = bitmap.getByteCount();
            ByteBuffer buffer = ByteBuffer.allocate(bytes); 
            bitmap.copyPixelsToBuffer(buffer); 

            byte[] array = buffer.array();
            byte[] arrsmall = compress(array); // Compress

            boolean retval = Arrays.equals(arrsmall, tmpbytes);

            if (!retval)
            {

                OutputStream out = clientSocket.getOutputStream(); 
                DataOutputStream dos = new DataOutputStream(out);
                dos.writeInt(arrsmall.length);
                dos.write(arrsmall, 0, arrsmall.length);
                dos.flush();

                tmpbytes = arrsmall;

            }

          }

            catch (UnknownHostException e) {
                //System.out.println(e.toString());
            } 

            catch (IOException e) {
                //System.out.println(e.toString());
            } 

            catch (Exception e1) {
                //Log.e("clients", e1.toString());
                //Toast.makeText(MainActivity.this, e1.toString(), Toast.LENGTH_LONG).show();
                System.out.println(e1.toString());
            }

        }

        class ClientThread implements Runnable { 

            @Override
            public void run() {

                try {

                    InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

                    clientSocket = new Socket(serverAddr, SERVERPORT);

                    new Thread(new CommsThread()).start();

                } catch (Exception e1) {
                    //Log.e("clients", e1.toString());
                    //Toast.makeText(MainActivity.this, e1.toString(), Toast.LENGTH_LONG).show();
                    System.out.println(e1.toString());
                } 

            }
        }


        class CommsThread implements Runnable {

            @Override
            public void run() {

                try {

                while(clientSocket.isConnected() && !Thread.currentThread().isInterrupted()){

                    //System.out.println("Waiting for server request");

                    BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

                    String message = reader.readLine();

                    if(message != null && !message.trim().isEmpty()) {

                    System.out.println("Message Received: " + message);

                    if(message.equalsIgnoreCase("screen"))

                        getBytes();

                    }

                    reader.close();

                    //clientSocket.close();

                    if(message.equalsIgnoreCase("exit")) break;

                    Thread.sleep(100);
                }
                System.out.println("Shutting down Socket!!");
                clientSocket.close();
                } catch (Exception e1) {
                    //Log.e("clients", e1.toString());
                    //Toast.makeText(MainActivity.this, e1.toString(), Toast.LENGTH_LONG).show();
                    System.out.println(e1.toString());
                } 

            }

            }

}

下面的LogCat

啟動apk時:

E        08-19 15:41:40.071: E/MoreInfoHPW_ViewGroup(6421): Parent view is not a TextView

E        08-19 15:41:40.341: E/ION(6421): ION_IOC_CUSTOM_GET_CONFIG ioctl Failed. Use default

僅當我關閉服務器時,LogCat才會收到該字符串命令:

I        08-19 15:42:20.350: I/System.out(6421): Message Received: screen

I        08-19 15:42:20.380: I/dalvikvm-heap(6421): Grow heap (frag case) to 10.888MB for 1536016-byte allocation

E        08-19 15:42:20.420: E/dalvikvm(6421): adjustAdaptiveCoef max=4194304, min=1048576, ut=568

E        08-19 15:42:20.440: E/dalvikvm(6421): adjustAdaptiveCoef max=6291456, min=1572864, ut=368

E        08-19 15:42:20.470: E/dalvikvm(6421): adjustAdaptiveCoef max=8388608, min=2097152, ut=256

I        08-19 15:42:20.630: I/System.out(6421): java.net.SocketException: Socket is closed

這里有任何建議,歡迎您。 :-)

只是一個建議,而不是使用自定義套接字和線程,您可以嘗試許多基於http的依賴項(例如Volley甚至Retrofit),並將字節數據作為多部分的http請求發送。 它將更加容易和清晰。 還是服務器無法使用HTTP進行通信?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM