我使用蓝牙编程做一个联机游戏。
大家都知道蓝牙编程是用socket和输入输出流socket.getInputStream();这样的语句进行连接对应。
但是到了真正使用的时候才发现了问题。
当我在一台手机发送信息之后,接着不久又再发送一段信息,有时就会出现错误了。
蓝牙的读取使用bytes = mmInStream.read(buffer);buffer的定义:byte[] buffer = new byte[1024],bytes是一个整型,用来记录信息的长度。mmInStream是一个InputStream的对象且已经通过上面的socket语句连接完成。
出现的错误就是,由于信息的发送时间间隔可能是比较短吧(但确实分两次发送),我在另外一台手机里面接收信息,然后通过信息判断对应信息该执行的操作动画效果之类的。但是当我接收到信息的时候有时候却是两个信息连在一起的,合成了一个信息,导致我接收方对信息的判断出错。
我对socket和输入输出流不太了解,只知道简单的应用,求解造成这情况的原因和解决方法!
在线等答复!
还需要我提供什么测试数据或者是相关代码的敬请跟帖回复!

解决方案 »

  1.   

    流就是一个通道,客户端接收的时候,不调用read,流是不会转给客户端的。你把instream看成一个水馆,读的端看作是一个水龙头,水龙头不打开,水是不会流出来的
      

  2.   

    @worik
    按照这样的传输机制的话,那么如果我的信息量不足1024个字节的话,我也需要补充满1024个字节……感觉这样对于信息传输通道会不会造成过多的不必要的数据包大小?还有就是我还需要在发送信息之前检查信息量是否完全充满了1024个字节数,如果不足我还需要调用相关函数进行补充。这样是不是也会造成发送信息这端执行的效率过低?假如我要采用你说的这种补充满1024个字节的发送信息机制,那么请问可不可以提供一个比较方便的函数调用给我参考一下?谢谢!
      

  3.   

    //s要发送的字串,size发送的长度,out输出流
    public  void writeFixedString(String s,int size,DataOutput out) throws IOException{
          for (int i = 0; i < size; i ++) {
              char c = 0;//用0填充
              if (i < s.length()) {
                  ch = s.charAt(i);
              }
              out.writeChar(ch);
          }
    }
    接受端做相应的处理。个人的想法,希望能帮到你。
      

  4.   

    @(worik)
    首先,谢谢你的答复。
    您最后的回复是写了一个客户端发送的信息生成函数,将要发送的信息通过自己的定制的长度和字符串形成一个固定长度的信息。其中调用了一个for循环和String串中的char的赋值,我不太懂时空代价的具体计算,但我总觉得这样的一个循环会浪费太多的时间,特别是当信息的长度有时比较大有时比较小的时候。比如1024个字节,有时需要用到将近1024个字节,有时却只需发送几个字节的消息,但是我每次都需要将剩余的空间补足到1024个字节再发送,那就相当的浪费了~