蓝牙连接; 无法正确发送字符串

当我需要将服务器蓝牙插槽中的字符串发送到我的客户端蓝牙插槽时,我的程序会遇到麻烦。 一切正常,只要我一次只发送一个字符串(例如聊天)但如果我需要在短时间内编写更多的字符串(以交换信息),字符串将不会从客户端代码中分离出来。 例如,如果我发送“FirstUser”并且在“SecondUser”之后,客户端不会读取“FirstUser”,然后读取“SecondUser”。 它将显示“FirstUserSecondUser”。 我怎样才能避免这种行为?

编辑:如果我让线程在能够发送新消息之前进入hibernate状态,它会读取正确的字符串,但是这个解决方案并不适合我的需要。

服务器代码:发送给所有客户端(已编辑)

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"); } } } 

服务器代码:从客户端读取:

  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(); } } } 

客户端代码:从服务器读取(已编辑)

 @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; } 

客户端代码:写入服务器

 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(); } } 

我感谢每一点帮助:)。

您需要封装数据项以避免连接。 这意味着您必须在继续之前编写和读取整个数据项。

你应该有一些实用方法来做到这一点,而不是直接使用OutputStream和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); } 

然后,您可以使用这些方法为服务器和客户端读取和写入String项。