title: Fragmented Image byte array over socket
body: <p>Im trying to send an image as a byte array over a socket to a client so it can view the image, and all goes well except when viewing the image its fragmented, i can view the top 10th of the image but the rest of it is grey and black pixels and i cant figure out why</p>
  
  <p>heres a piece of my server code:</p>
  
  <pre><code>    public synchronized void nextFrame(VideoFrame frame) {
          // This method is called when a new frame is ready.
          // Don't forget to recycle it when done dealing with the frame.
  
          // draw the new frame onto the JLabel
              go = true;
              pic = frame.getBytes();
              go = false;
              label.getGraphics().drawImage(frame.getBufferedImage(), 0, 0, width, height, null);
              frame.recycle();
  
      }
  }
  
  class server extends Thread{
      int port;
      ServerSocket socket;
      Socket temps = null;
      boolean go = true;
      server(int p){
          port = p;
          start();
      }
  
      public void run(){      
  
          while(go == true){
              try {
                  socket = new ServerSocket(port, 10);
                  socket.setSoTimeout(10000);
                  temps = socket.accept();
                  new connect(temps);
                  port += 1;
              } catch (IOException e) {
                  if(e.getMessage().toString().equalsIgnoreCase("Accept timed out")){
                      go = false;
                  }else{
                      e.printStackTrace();
                  }
                  break;
              }
  
          }
          try {
              socket.close();
              System.out.println("Closing socket server(no more connections will be created)");
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }
  
  class connect extends Thread{
      Socket connection;
      ObjectOutputStream out;
      int port;
      String host;
      GetInput in;
      connect(Socket s){
          try {
              connection = s;
              out = new ObjectOutputStream(connection.getOutputStream());
              host = connection.getInetAddress().getHostName();
              port = connection.getPort();
              System.out.println("Connected to " + host + ":" + port);
              in = new GetInput(connection);
              start();
          } catch (IOException e) {
              e.printStackTrace();
          }   
      }
  
      public void run(){
          try {
              out.writeInt(Main.pic.length);
          } catch (IOException e1) {
              e1.printStackTrace();
          }
          while(in.isAlive()){
              if(Main.go){    
                  try {
                      out.write(Main.pic);
                  } catch (IOException e) {
                          e.getMessage().toString();
                  }
              }
          }
          try {
              out.close();
              connection.close();
              System.out.println("Closing " + host + ":" + port);
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }
  class GetInput extends Thread{
      ObjectInputStream in;
      GetInput(Socket s){
          try {
              in = new ObjectInputStream(s.getInputStream());
          } catch (IOException e) {
              e.printStackTrace();
          }
          start();
      }
      public void run(){
          try{
              boolean go = in.readBoolean();
              int a = (go?1:0);
              System.out.println(a);
          } catch (IOException e) {
                  e.getMessage().toString();
          }
          try {
              in.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }
  </code></pre>
  
  <p>i know the frame grabber is grabbing the image right because im also displaying the image on the server and it looks fine, so that means the byte arrays not getting sent over the sockets correctly, but why?</p>
  
  <p>EDIT: heres my client code, its an android app</p>
  
  <pre><code>package org.smiley.doom;
  
  import java.io.IOException;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  
  import java.net.InetAddress;
  import java.net.Socket;
  import java.net.UnknownHostException;
  
  import android.app.Activity;
  import android.graphics.Bitmap;
  import android.graphics.BitmapFactory;
  import android.os.Bundle;
  import android.view.View;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.ImageView;
  import android.widget.TextView;
  
  public class ClientActivity extends Activity implements View.OnClickListener{
  
      Socket s;
      InetAddress inet;
      ObjectOutputStream out;
      ObjectInputStream in;
      TextView log;
      ImageView im;
      Button send;
      EditText tip;
      int rport;
      String ip;
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
  
          tip = (EditText) findViewById(R.id.etIP);
          send = (Button) findViewById(R.id.bSEND);
          im = (ImageView) findViewById(R.id.ivPIC);
          log = (TextView) findViewById(R.id.tvLog);
  
          s = null;
          in = null;
          out = null;
  
          send.setOnClickListener(this);
      }
  
      @Override
      public void onClick(View arg0) {
          switch(arg0.getId()){
              case R.id.bSEND:
                  final int len;
                      try {
                          inet = InetAddress.getByName("192.168.0.2");
                          s = new Socket(inet, 4321);
                          in = new ObjectInputStream(s.getInputStream());
                          out = new ObjectOutputStream(s.getOutputStream());
                          log.setText("Client opened");
                          len = in.readInt();
                          new Thread(new Runnable(){
  
                              @Override
                              public void run() {
                                      byte[] b = new byte[len];
                                      try {
                                          in.read(b);
                                          log.setText(""+s.getReceiveBufferSize());
                                      } catch (IOException e1) {
                                          e1.printStackTrace();
                                      }
                                      final byte[] l = b;
                                      im.post(new Runnable(){
                                          @Override
                                          public void run() {
                                              Bitmap bmp = BitmapFactory.decodeByteArray(l, 0, l.length);
                                              im.setImageBitmap(bmp);                             
                                          }
                                      });
                                      try {
                                          out.writeBoolean(true);
                                          out.close();
                                          in.close();
                                          s.close();
                                          //log.setText("Client closed");
                                      } catch (IOException e) {
                                          e.printStackTrace();
                                      }
                              }
  
                          }).start();;
                      } catch (UnknownHostException e) {
                          e.printStackTrace();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
              break;
          }
      }
  }
  </code></pre>