我在程序中的IDTCPSERVER控件的EXECUTE事件中使用这段代码来从SERVER端读取客户端返回的数据:
clearbuf('r');
AThread.Connection.ReadBuffer(ReceiveBuf,nDataLength);
可是由于nDataLength不是固定不变的,无法确定它,导致阻塞,
请问有什么办法可以确定接收到的数据的长度?
clearbuf('r');
AThread.Connection.ReadBuffer(ReceiveBuf,nDataLength);
可是由于nDataLength不是固定不变的,无法确定它,导致阻塞,
请问有什么办法可以确定接收到的数据的长度?
解决方案 »
- 为什么panel放在groupbox上,groupbox上的componentCount却是0呢
- 关于一个多条件查询语句写法
- DBGRID中的数据如何显示为多行/
- asp如何实现用midas接口访问sql server数据库,急!!谢高手赐教!
- delphi如何实现主动群发消息给各个在线客户端啊?
- 请问一个窗体问题:一个主窗体和两个窗体,程序运行时主窗体和子窗体同时显示,两个子窗体上下排列,请问如何实现?
- 终于找到条形码的打印控件!
- access里面的“是/否”类型字段如何设置其默认值?
- 请教个问题,怎样把form上的所有edit的text清空,
- 画图软件的ONPAINT事件函数怎么写?38分
- 请教如何代替这个nil值.
- 大家帮忙看看好吗?这个文本处理控件的程序有问题
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,WriteStream
Server 1, size = ReadInteger();
2, ReadStream(AMM, ASize, False);
在终端上的辅口连接一台串口的仪器,通讯指令都是BYTE型的,使用BUFFER最合适
所以你们说的两边建立标准的事是不可能的了.
可以一个个读来分析的~
这不是Socket的问题,呵呵~
定义协议需要客户端也定义协议啊,我的客户端是一台终端机,是硬件,无法改变的.怎么能定义协议呢,终端上的串口设备也是硬件不是电脑,所以只能是服务端去适应它们啊
to xjjrocker:
你定义这个是指把BUFFER做成定长的,但是那需要发送端也发这么大的呀,如果发送端只发来4个字节,就会导致阻塞了,直到真的收到了这么多数据,才会放出来.
to littlefishli:
INDY 9 也可以这样的,但是问题是这个指令是读行的,不爽.能没READBUF和WRITEBUF用起来方便啊 所以才问有没有办法
你能说详细点吗?什么叫业务处理逻辑代码?我就是想问SERVER控件的EXECUTE事件中的READBUFFER(BUF,BUFSIZE)中的BUFSIZE如何确定,虽然我知道每次应返回多少个字节,但是我在别的按钮事件中在每发一个指令前,修改一个全局变量来控制它的长度时发现,它总是晚一次,不象在EXECUTE事件中来维修这个长度值那么实时,因此也会发生了错误.
有没有别的什么办法?
>>数据长度变化范围很大,从最小的4个字节,到300个字节思路:
能总结出这些数据包的发包规律吗?然后,写一个算法,自行在程序员计算下一个待接受的字节数;
我现在就是象do2008说的那样,在每发一个指令前先根据本指令将返回的字节数来维修一个全局变量,然后把这个变量当成SIZE.但是使用中发现一个问题,如果在按钮事件里去维修这个变量的话,和在EXECUTE事件中维改这个变量效果不一样.在EXECUTE中修改是没问题的,是实时的,但是在按钮事件里去修改的话好象总是慢一拍,就是这次修改的话,下次来数据才能体现出来.
你说的这个方法的确可以在第一次正确地得出接收到的字节数,但是后来它就一直等于-1了,无法正常工作.最后没有办法了,我只要使用READLN和WRITELN了.
多谢各位的参与和帮助.结贴散分.分少的别怪我啊.