Отправить изображение через сокет: ByteArrayOutputStream.size () возвращает отрицательное значение (иногда) - PullRequest
0 голосов
/ 01 мая 2020

Я делаю сервер-клиентскую программу, сервер на компьютере Java, а клиент - android app (android studio), и я пытаюсь отправить изображение с сервера на клиент и показать это изображение на экране клиента с помощью ImageView. Проблема в том, что иногда это работает, а иногда не работает. Похоже, что бывают случаи, когда ByteArrayOutputStream.size () возвращает отрицательное значение на стороне клиента в переменной len (которая сохраняет длину). Когда возвращаемое значение положительно, это работает. Почему я получаю отрицательные значения (иногда)?

Код сервера:

    public class Server extends JFrame {
    BufferedImage bi,inputImage;
    JButton btn;
    ServerSocket serverSocket;
    Socket socket;
    private Scanner in;
    private PrintWriter out;
    public Server(){
        File imageFile = new File("ssss.PNG");
        try {
             bi = ImageIO.read(imageFile);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        this.add(btn = new JButton("Send"), BorderLayout.NORTH);
        this.add(new JLabel(new ImageIcon(bi)), BorderLayout.CENTER);
        this.setSize(200, 180);
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        try{
             serverSocket = new ServerSocket(8000);
             socket = serverSocket.accept();
             in = new Scanner(socket.getInputStream());
             out = new PrintWriter(socket.getOutputStream(), true);
        }
        catch(IOException ex){
            System.err.println(ex);
        }
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                out.println("IMAGE");
               sendImage(new File("ssss.PNG"));
               // try {
                   // ImageIO.write(bi, "PNG", socket.getOutputStream());
                //} catch (IOException e) {
                    // TODO Auto-generated catch block
                 //   e.printStackTrace();
              // }
            }
        });  
    }
    public static void main(String[] args) {        
                new Server();
    }
    public void sendImage(File file){
        try {
            DataOutputStream out = new DataOutputStream(
                    socket.getOutputStream());
            DataInputStream dis = new DataInputStream(new FileInputStream(file));
            ByteArrayOutputStream ao = new ByteArrayOutputStream();
            int read = 0;
            byte[] buf = new byte[dis.available()];
            while ((read = dis.read(buf)) > -1) {
                ao.write(buf, 0, read);
            }
            System.out.println("ao.size(): "+ao.size());
            out.writeInt(ao.size());
            out.write(ao.toByteArray());
            out.flush();
           // out.close();
           // dis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Код клиента (android):

    public class MainActivity extends AppCompatActivity {
    public Socket socket;
    public PrintWriter out;
    public Scanner in;
    public TextView textView;
    public DataOutputStream dos=null;
    public DataInputStream dis=null;
    public ImageView imageView;
    public Bitmap bitmap;
    private static final int SERVERPORT = 8000;
    private static final String SERVER_IP = "192.168.5.59";
    public static final String TAG="TAG";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView=(TextView)findViewById(R.id.text);
        imageView=(ImageView)findViewById(R.id.imageView);
        imageView.setImageResource(R.drawable.ic_launcher_background);
        new Thread(new ClientThread()).start();
    }
    class ClientThread implements Runnable {
        @Override
        public void run() {
            try {
                Log.d(TAG, "try to connect...");
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                socket = new Socket(serverAddr, SERVERPORT);
                in = new Scanner(socket.getInputStream());
                out = new PrintWriter(socket.getOutputStream(), true);
                Log.d(TAG, "connected1234");
                while (in.hasNextLine()) {
                    String response = in.nextLine();
                    if (response.startsWith("IMAGE")) {
                        InputStream in = socket.getInputStream();
                        Log.d(TAG, "in: "+in);
                        DataInputStream input = new DataInputStream(in);
                        Log.d(TAG, "input: "+input);
                        byte[] data;
                        int len= input.readInt();
                        Log.d(TAG, "len: "+len);
                        data = new byte[len];
                        Log.d(TAG, "data: "+data);
                        if (len > 0) {
                            input.readFully(data,0,data.length);
                        }
                        final Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data .length);
                        Log.d(TAG, "Bitmap: "+bitmap);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                imageView.setImageBitmap(bitmap);
                            }
                        });
                    }
                }
            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }
}

Ошибка:

len: -298696669
E/AndroidRuntime: FATAL EXCEPTION: Thread-5
Process: com.example.sendimageexample, PID: 17224
java.lang.NegativeArraySizeException: -298696669
    at com.example.sendimageexample.MainActivity$ClientThread.run(MainActivity.java:80)
    at java.lang.Thread.run(Thread.java:784)`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...