Enviando uma imagem por socket

Estou usando os seguintes códigos para o envio de uma imagem por sockets java:

Código Servidor: O método é executado por uma thread

@Override
        public void run() {
        init = true;
            while (init) {
                try {
                    final Socket socket = server.accept();
                    Host host = controleServico.getServico().getHost();
                        String fileName = host.getHostname() + host.getUsername().toUpperCase() 
                                + "_to_" + socket.getInetAddress().getCanonicalHostName();
                    final File file = new File(fileName + ".jpg");
                    PrintScreen.setPrintFile(PrintScreen.getPrintScreen(), file, PrintScreen.TIPO_IMAGEM.JPG);

                    new Thread(new Runnable() {

                        @Override
                        public void run() {
                            System.out.println("Enviando arquivo: " + file.getAbsolutePath());
                            byte[] mybytearray = new byte[(int) file.length()];

                            BufferedInputStream bis;
                            try {
                                //System.out.println("enviar tamanho do arquivo " + (int)file.length());
                                //socket.getOutputStream().write((int)file.length());
                                //socket.getOutputStream().flush();
                                System.out.println("enviado " + (int)file.length());
                                bis = new BufferedInputStream(new FileInputStream(file));
                                bis.read(mybytearray, 0, mybytearray.length);
                                OutputStream os = socket.getOutputStream();
                                os.write(mybytearray, 0, mybytearray.length);


                                os.flush();

                                System.out.println("arquivo enviado");
                            } catch (FileNotFoundException ex) {
                                Logger.getLogger(PrintScreenServer.class.getName()).log(Level.SEVERE, null, ex);
                            } catch (IOException ex) {
                                Logger.getLogger(PrintScreenServer.class.getName()).log(Level.SEVERE, null, ex);
                            }finally{
                                try {
                                    socket.close();
                                } catch (IOException ex) {
                                    Logger.getLogger(PrintScreenServer.class.getName()).log(Level.SEVERE, null, ex);
                                }
                            }
                        }
                    }).start();

                } catch (IOException ex) {
                    Logger.getLogger(PrintScreenServer.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

Código Cliente:

Timer.executarApos(100, new Runnable() {
            @Override
            public void run() {
                Socket sock;
                try {
                    sock = new Socket(e.getHost().getIp(), PORTA_SERVER_PRINTS);
                    ControleCentral.setLog("print " + e.getNomeQualificado());
                    //int bytes = sock.getInputStream().read();
                    //ControleCentral.setLog("quantidade de bytes " + bytes);
                    byte[] mybytearray = new byte[200100];
                    InputStream is = sock.getInputStream();
                    FileOutputStream fos = new FileOutputStream(Monitoramento.getNomeFileScreen(e));
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    int bytesRead = is.read(mybytearray, 0, mybytearray.length);
                    int current = 0;
                    bos.write(mybytearray, 0, bytesRead);
                    current = bytesRead;
                    do {
                        bytesRead = is.read(mybytearray, current, (mybytearray.length - current));

                        if (bytesRead >= 0) {
                            current += bytesRead;
                        }
                    } while (bytesRead > -1);

                    bos.write(mybytearray, 0, current);
                    bos.flush();
                    bos.close();
                    sock.close();

                    BufferedImage bi = ImageIO.read(new File(Monitoramento.getNomeFileScreen(e)));


                    BufferedImageSeriolizable bis = new BufferedImageSeriolizable(bi);
                    e.setScreenImage(bis);
                    Monitoramento.exibirPrintScreen(e, ControleMonitoramentoPorImagens.getPainel(e));
                    ControleCentral.setLog("print ok " + e.getNomeQualificado());

                } catch (UnknownHostException ex) {
                    Logger.getLogger(Monitoramento.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Monitoramento.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        });

Porem, vejam o que acontece com a imagem recebida no cliente, e o tamanho dela é maior do que a enviada pelo servidor. Não sei como identificar e corrigir o problema, alguém tem alguma sugestão?

https://www.filepicker.io/api/file/QtsXmsRaq7neozn3b1LA

www.zmeck.nulline.com

dá uma olhada, se quiser pode descompilar, ou eu te envio o source…