我在程序中的IDTCPSERVER控件的EXECUTE事件中使用这段代码来从SERVER端读取客户端返回的数据:
    clearbuf('r');
    AThread.Connection.ReadBuffer(ReceiveBuf,nDataLength);
    可是由于nDataLength不是固定不变的,无法确定它,导致阻塞,
    请问有什么办法可以确定接收到的数据的长度?

解决方案 »

  1.   

    方法可以是这样,事先定义一套通讯协定如定义一个通讯头
    TCommHear = Record
        iType: word;//通讯类型
        iMemo: word;//备用,凑够8个字节
        iLen : DWORD;//接下来,还有多少字节的数据
      end;
    实现方法,伪码如下
    1.客户端var 
    ch:TCommHear;  ch.iType = 1;
      ch.iType = 0;
      ch.iLen = 1024;//传输数据长度,在代码中计算  sendbuf(ch);//发送8个字节的通讯头2.服务器端,首先接收指定的8个字节;  ReadBuffer(ch,sizeof(ch))然后,再接收业务数据
      ReadBuffer(ch,sizeof(ch))
      ...
      ReadBuffer(buf,ch.iLen);总之,就是简单定义一套通讯协议即可,然后通讯双方按照这个协定来传输数据即可  
      

  2.   

    Client 1,WriteInteger
           2,WriteStream  
          Server 1, size = ReadInteger();
           2, ReadStream(AMM, ASize, False);
      

  3.   

    我的客户端是一台硬件,不能调试无法做处理的,它是一台终端机
    在终端上的辅口连接一台串口的仪器,通讯指令都是BYTE型的,使用BUFFER最合适
    所以你们说的两边建立标准的事是不可能的了.
      

  4.   

    你需要定义协议~
    可以一个个读来分析的~
    这不是Socket的问题,呵呵~
      

  5.   

    indy10根本不用这么麻烦。。每次Writeln Readln就行了。。其他的事情indy帮你做了。
      

  6.   

    to ly_liuyang:
    定义协议需要客户端也定义协议啊,我的客户端是一台终端机,是硬件,无法改变的.怎么能定义协议呢,终端上的串口设备也是硬件不是电脑,所以只能是服务端去适应它们啊
    to xjjrocker:
    你定义这个是指把BUFFER做成定长的,但是那需要发送端也发这么大的呀,如果发送端只发来4个字节,就会导致阻塞了,直到真的收到了这么多数据,才会放出来.
    to littlefishli:
    INDY 9 也可以这样的,但是问题是这个指令是读行的,不爽.能没READBUF和WRITEBUF用起来方便啊  所以才问有没有办法
      

  7.   

    >>在终端上的辅口连接一台串口的仪器,通讯指令都是BYTE型的,使用BUFFER最合适>>定义协议需要客户端也定义协议啊,我的客户端是一台终端机,是硬件,无法改变的.怎么能定义协议呢,终端上的串口设备也是硬件不是电脑,所以只能是服务端去适应它们啊有通讯指令,那好办多了,只要知道通讯的大概内容,应该不难写相关的业务处理逻辑代码的
      

  8.   

    to do2008:
    你能说详细点吗?什么叫业务处理逻辑代码?我就是想问SERVER控件的EXECUTE事件中的READBUFFER(BUF,BUFSIZE)中的BUFSIZE如何确定,虽然我知道每次应返回多少个字节,但是我在别的按钮事件中在每发一个指令前,修改一个全局变量来控制它的长度时发现,它总是晚一次,不象在EXECUTE事件中来维修这个长度值那么实时,因此也会发生了错误.
      

  9.   

    设置ReadTimeOut的话,那么我就要设置定长的接收长度.如果来的数据是短的话,就要等到超时才能结束是吧,可是我的数据长度变化范围很大,从最小的4个字节,到300个字节,接收超时时间设置大了,每个小命令也要等一会才能有反应,设置小了,大的数据还没收完.怎么办?
    有没有别的什么办法?
      

  10.   

    >>虽然我知道每次应返回多少个字节
    >>数据长度变化范围很大,从最小的4个字节,到300个字节思路:
    能总结出这些数据包的发包规律吗?然后,写一个算法,自行在程序员计算下一个待接受的字节数;
      

  11.   

    Size:= AThread.Connection.ReadFromStack(false,100,false);
      

  12.   

    好,明天我回单位试试,家里没有设备没法试验.
    我现在就是象do2008说的那样,在每发一个指令前先根据本指令将返回的字节数来维修一个全局变量,然后把这个变量当成SIZE.但是使用中发现一个问题,如果在按钮事件里去维修这个变量的话,和在EXECUTE事件中维改这个变量效果不一样.在EXECUTE中修改是没问题的,是实时的,但是在按钮事件里去修改的话好象总是慢一拍,就是这次修改的话,下次来数据才能体现出来.
      

  13.   

    imho888:
    你说的这个方法的确可以在第一次正确地得出接收到的字节数,但是后来它就一直等于-1了,无法正常工作.最后没有办法了,我只要使用READLN和WRITELN了.
    多谢各位的参与和帮助.结贴散分.分少的别怪我啊.