通过TCP建立客户端和服务器之间的连接
并且数据通信按照既定的协议进行传递
客户端发送数据是一帧一帧的断断续续的发送
如规定协议中规定每个数据帧的标志位为连续的4个0x00
如何通过InputStream读取服务器接收到来自客户端的数据
并将每个数据帧放入一个数组中?

解决方案 »

  1.   

    如规定协议中规定每个数据帧的标志位为连续的4个0x00  我觉得这样不合适。 
    InputStream中找4个0x00 和4个0x00之间的内容放入到数组中。如果只有一个4个0x00 就全部放进去
      

  2.   

    终于搞定了~
    主要是协议解析的部分,把代码贴出来共享下...
    暂时协议还没有进一步讨论,目前协议以连续四个结束标志0xFF结束public void run(){
    int value= 0;
    int length= 0;
    int flagSum= 0;
    try{
    ByteBuffer byteBuffer= ByteBuffer.allocate(1024);
    while((value= inStream.read())!= -1){
    if(length== 0){
    System.out.println(new Date()+ "  "+ socket.getInetAddress()+ "  "+ socket.getPort());
    }
    System.out.print(value+ " ");
    byteBuffer.put((byte)value);
    length++;
    if(value== 255){
    flagSum++; //遇到标志位,则将标志位个数加1
    }else{
    flagSum= 0;
    }

    if(flagSum== 4){
    System.out.println("Length= "+ length);

    byteBuffer.flip(); //结束当前缓冲区添加操作

    byte[] data= new byte[byteBuffer.limit()];
    byteBuffer.get(data);

    byteBuffer.clear();

    System.out.println("协议解析后的信息如下:");
    MessageFrame msg= new MessageFrame(data);

    System.out.println("head CommandType: "+ msg.getCommandType());
    System.out.println("head DeviceType: "+ msg.getDeviceType());
    System.out.println("head ObjectType: "+ msg.getObjectType());
    System.out.println("head ObjectId: "+ msg.getObjectId());


    Iterator<Object> listIterator= msg.listValues().listIterator();
    while(listIterator.hasNext()){
    Object o= listIterator.next();
    System.out.println(o.getClass()+ ": "+ o);
    }
    System.out.println();

    flagSum= 0; //标志位重新开始计数
    length= 0; //帧数据长度置0
    }
    }
    }catch(IOException e){
    e.printStackTrace();
    }

    }
      

  3.   

    为了更好的利用可用分
    希望继续深入的讨论这个通信问题
    UDP通信直接发送,接收时有信息接收
    没有信息的时候就一直阻塞
    TCP通信过程中,InputStream和OutputStream一直存在
    而且通信过程中信息一般是断续的
    如何更好的区分一个个的数据信息?
    上面是以结束标志来判断,也可以通过加数据长度位
    其他的还有更好的方法吗?...欢迎建议
      

  4.   

    为什么要这么做??
    4个0x00,普通数据中存在这种数据的太多太多了如果你是要做TCP分包的话...不是这么做的...
    一个TCP包应该被分为包头,包体
    包头采用固定长度字节序,并且,每个字节序根据双方协议来定义
    一般在包头中会指明,包体长度根据包体长度来接收包体数据,即可保持一个包的完整性
    采用标志位的方法,只能适用于某些特定的数据,没有通用性
    因为你无法保证正常数据中不会包含标志位信息
      

  5.   

    现在结束标志如果用连续的0X00的确是有问题的
    就是用0xFF也是不可以的,异常情况下很有可能出现的就是这种情况
    因此现在建议该成连续的四个数字了,比如出现连续的0x56,0x57,0x58,0x58
    这样可以很好的判断数据帧的结束吧~
    协议方面的东西,的确还是要看看的
      

  6.   

    一个TCP包应该被分为包头,包体 
    包头采用固定长度字节序,并且,每个字节序根据双方协议来定义 
    一般在包头中会指明,包体长度