title: Synchronize server with client java sockets
body: <p>Currently I am working on a server/client application which sends data using java with <code>Runnable</code> and <strong>threads</strong>. The problem is that the client is sending the data and when the server starts to read it the client has already finished and closed the connection which on the server side only a partially of the data is arrived, can they be setup to be synchronized? </p>
  
  <p>this is the <strong>client</strong>:</p>
  
  <pre><code>private void ConnectionToServer(final String ipAddress, final int Port) {
     final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
  
     Runnable serverTask = new Runnable() {
          @Override
          public void run() {
              try {
                  socket = new Socket(ipAddress, Port);
  
                  bos = new BufferedOutputStream(socket.getOutputStream());
                  dos = new DataOutputStream(socket.getOutputStream());
  
                  File f = new File("C:/Users/lukeLaptop/Downloads/RemoveWAT22.zip");
  
                  String data = f.getName()+f.length();
                  byte[] b = data.getBytes();
  
                  sendBytes(b, 0, b.length);
  
  
                  dos.flush();
                  bos.flush();
  
                  bis.close();
  
                  dos.close();
  
                  //clientProcessingPool.submit(new ServerTask(socket));
             } catch (IOException ex) {
                 Logger.getLogger(ClientClass.class.getName()).log(Level.SEVERE, null, ex);           } finally {
  
             }
  
         }
      };
  
      Thread serverThread = new Thread(serverTask);
      serverThread.start();
  
      public void sendBytes(byte[] myByteArray, int start, int len) throws IOException {
      if (len &lt; 0) {
          throw new IllegalArgumentException("Negative length not allowed");
      }
      if (start &lt; 0 || start &gt;= myByteArray.length) {
          throw new IndexOutOfBoundsException("Out of bounds: " + start);
      }
  // Other checks if needed.
  
  // May be better to save the streams in the support class;
      // just like the socket variable.
      OutputStream out = socket.getOutputStream();
      DataOutputStream dos = new DataOutputStream(out);
  
      dos.writeInt(len);
      if (len &gt; 0) {
          dos.write(myByteArray, start, len);
      }
  }
  </code></pre>
  
  <p><strong>server code</strong>:</p>
  
  <pre><code>   private void acceptConnection() {
  
      try {
  
          final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);
  
          Runnable serverTask = new Runnable() {
              @Override
              public void run() {
                  try {
                      ServerSocket server = new ServerSocket(8080);
  
                      while (true) {
                          socket = server.accept();
  
                          System.out.println("Got a client !");
  
                          bis = new BufferedInputStream(socket.getInputStream());
  
                          dis = new DataInputStream(socket.getInputStream());
  
                          String data = readBytes().toString();
  
                          System.out.println(data);
  
  
                          bos.close();
  
                          dis.close();
  
                          //clientProcessingPool.submit(new ClientTask(socket));
                      }
                  } catch (IOException ex) {
                      System.out.println(ex.getMessage());
                  }
              }
          };
          Thread serverThread = new Thread(serverTask);
          serverThread.start();
  
      } catch (Exception io) {
  
          io.printStackTrace();
  
      }
  
  }
  
  public byte[] readBytes() throws IOException {
      // Again, probably better to store these objects references in the support class
      InputStream in = socket.getInputStream();
      DataInputStream dis = new DataInputStream(in);
  
      int len = dis.readInt();
      byte[] data = new byte[len];
      if (len &gt; 0) {
          dis.readFully(data);
      }
      return data;
  }
  </code></pre>