使用TIdTCPClient.WriteBuffer发送一串16进制数据(长度不定),server端如何知道需要读多少个字节呢?有没可能server端只读取了半个包,或者一次读取了2个包。
另外TIdTCPClient没有Execute事件,如果只想被动的接受server端发送的数据,是否只能不停的去掉用ReadBuffer过程,读出的数据是否要和串口通讯一样在去组包。
欢迎高人回答,人人有分!!!
另外TIdTCPClient没有Execute事件,如果只想被动的接受server端发送的数据,是否只能不停的去掉用ReadBuffer过程,读出的数据是否要和串口通讯一样在去组包。
欢迎高人回答,人人有分!!!
解决方案 »
- 怎么获得系统进程数量?
- 如何压缩和修复Access2007数据库文件(.accdb)
- ADO访问SQL要先通过网上邻居访问数据库服务器一次,ADO才能连接,忘大侠帮忙解答
- delphi的乐趣题
- 怎么得到ActionList中的Standard Action的代码?
- 关于窗口的设置问题(急!!!!)
- 郁闷!我的机器上找不到VCLBDE50.BPL,谁好心发一个给我吧!马上给分!!
- 哪里有delphi6完整版下载啊!
- RAVE報表問題
- ----100分-----请问再写corba object程序是出现 file not fount"orbpas.dsu"---请问各位大虾该如何处理?
- 关于类的复制
- 把一个窗口加入dll中,在程序最后关闭时,用RmDir('文件路径+文件名')删除文件,报告错误。
可以先发送一个标志符+长度吗?
---------------------------------------------
server端要预先知道包的大小,用在线程里用athread.connection.readBuffer(block,sizeof(block))读取。他是阻塞式的,不会只读取了半个包,或者一次读取了2个包。------------------------
另外TIdTCPClient没有Execute事件,如果只想被动的接受server端发送的数据,是否只能不停的去掉用ReadBuffer过程,读出的数据是否要和串口通讯一样在去组包。
---------------------------
TIdTCPClient一般开一个线程,在线程里ReadBuffer,来读取服务器端发的数据。道理同server端读数据一样:readBuffer(block,sizeof(block),不用重新组包。
同理, 底层缓冲区中可能已经有对方多次发送的数个小包了, 这种情况下你读到的当然就是多个包.
经过实际的测试,服务端连续调用WriteBuffer,客户端使用多线程读连续的ReadBuffer,得到的数据包倒是比较规则,是不是可以认为出错的几率很小啊
ReadBuffer这样的功能,INDY本来就不该提供它.
TCPClient1.WriteInteger(DataLen);
TCPClient1.OpenWriteBuffer;
TCPClient1.WriteBuffer(Buffer,DataLen);
TCPClient1.CloseWriteBuffer;
而服务器端可以先读接收数据长度,再读数据如:
with AThread.Connection do
begin
DataLen:=ReadInteger;
ReadBuffer(Buffer,DataLen);
end;
with IdTCPClient1 do
begin
WriteInteger(DataLen);
OpenWriteBuffer;
WriteBuffer(Buffer,DataLen);
CloseWriteBuffer;
end;
接收方首先确定接收长度再接收数据如:
with AThread.Connection do
begin
DataLen:=ReadInteger;
ReadBuffer(Buffer,DataLen);
end;
~~ ~~
而不是“是否收到”
~~收到半个或一个是可能的,但ReadBuffer(Buffer,DataLen);是阻塞在那里的,收到半个包时不会向下运行;如果一次收到两个包,ReadBuffer(Buffer,DataLen);一次只读取一个包的内容,下次ReadBuffer时读剩下的一个包。