Conexión Bluetooth; no puede enviar cadenas correctamente

Tengo problemas con mi progtwig cuando necesito enviar cadenas desde mi servidor bluetooth-socket a mi cliente bluetooth-socket. Todo funciona bien siempre y cuando solo esté enviando una Cadena a la vez (por ejemplo, chateando), pero si necesito escribir más Cadenas en un corto período de tiempo (para intercambiar información), las Cadenas no se separarán del código del cliente . Por ejemplo, si estoy enviando “FirstUser” y justo después de eso, “SecondUser” el cliente no lee “FirstUser” y luego “SecondUser”. Leerá “FirstUserSecondUser”. ¿Cómo puedo evitar este comportamiento?

Edición: si dejo que el hilo entre en suspensión antes de que pueda enviar un mensaje nuevo, lee las cadenas correctas, pero esta solución no funciona bien para mi necesidad.

Código de servidor: envío a todos los clientes (editado)

public synchronized void sendToAll(String message) { try { Thread.sleep(100); } catch (InterruptedException e1) { e1.printStackTrace(); } publishProgress(message); for(OutputStream writer:outputList) { try { writer.write(message.getBytes()); writer.flush(); } catch (IOException e) { System.out.println("Some-Error-Code"); } } } 

Código de servidor: lectura de un cliente:

  public void run() { String nachricht; int numRead; byte[] buffer = new byte[1024]; while (runningFlag) { try { if((numRead = inputStream.read(buffer)) >= 0) { nachricht = new String(buffer, 0, numRead); serverThread.handleMessage(nachricht); } } catch (IOException e) { this.cancel(); e.printStackTrace(); } } } 

Código de cliente: lectura del servidor (editado)

 @Override protected Void doInBackground(Integer... ints) { String nachricht = new String(); byte[] buffer = new byte[1024]; int numRead; while (runningFlag) { try { if(((numRead = inputStream.read(buffer)) >= 0)) { nachricht = new String(buffer, 0, numRead); publishProgress(nachricht); } } catch (IOException e) { clientGame.finish(); e.printStackTrace(); } } return null; } 

Código de cliente: escribir al servidor

 public synchronized void write(String nachricht) { try { Thread.sleep(100); } catch (InterruptedException e1) { e1.printStackTrace(); } try { outputStream.write(nachricht.getBytes()); outputStream.flush(); } catch (IOException e) { this.cancel(); e.printStackTrace(); } } 

Aprecio cada pequeña ayuda :).

Debe encapsular su elemento de datos para evitar la concatenación. Esto significa que debe escribir y leer un elemento de datos completo antes de continuar.

Debe tener algunos métodos de utilidad para hacerlo en lugar de utilizar directamente los métodos de OutputStream y InputStream:

 public static void writeItem(OutputStream out, String s) throws IOException { // Get the array of bytes for the string item: byte[] bs = s.getBytes(); // as bytes // Encapsulate by sending first the total length on 4 bytes : // - bits 7..0 of length out.write(bs.length); // modulo 256 done by write method // - bits 15..8 of length out.write(bs.length>>>8); // modulo 256 done by write method // - bits 23..16 of length out.write(bs.length>>>16); // modulo 256 done by write method // - bits 31..24 of length out.write(bs.length>>>24); // modulo 256 done by write method // Write the array content now: out.write(bs); // Send the bytes out.flush(); } public static String readItem(InputStream in) throws IOException { // first, read the total length on 4 bytes // - if first byte is missing, end of stream reached int len = in.read(); // 1 byte if (len<0) throw new IOException("end of stream"); // - the other 3 bytes of length are mandatory for(int i=1;i<4;i++) // need 3 more bytes: { int n = in.read(); if (n<0) throw new IOException("partial data"); len |= n << (i<<3); // shift by 8,16,24 } // Create the array to receive len bytes: byte[] bs = new byte[len]; // Read the len bytes into the created array int ofs = 0; while (len>0) // while there is some byte to read { int n = in.read(bs, ofs, len); // number of bytes actually read if (n<0) throw new IOException("partial data"); ofs += n; // update offset len -= n; // update remaining number of bytes to read } // Transform bytes into String item: return new String(bs); } 

Luego, utiliza estos métodos para que el servidor y el cliente lean y escriban sus elementos de cadena.