IDtcpconnection组件,writeln()和writebuffer()有什么区别?不是那么简单哦

cjf1009 2004-10-12 05:33:00
server端收到传输命令后开始传送文件,客户端用readln()发送命令可以,但用writebuffer()不可以,为什么?
client端程序:

exepath := ExtractFilepath(application.ExeName) + 'maps\';
Commblock.Command := 'shengji';
idtcpclient1.WriteBuffer(commblock, SizeOf (commblock),true); //发送升级请求
UpdateStream:=TMemoryStream.Create;
try
idtcpclient1.ReadStream(UpdateStream,-1,false); //读出内存流到stream,运行到这里出错“stream read error”
UpdateStream.Seek(0, soFromBeginning);
DeCompressFiles(exepath,UpdateStream);
Sleep(200);//等待解压过程结束
Caption:=Caption+'-->升级成功.';
finally
UpdateStream.Free;
end;

server端程序:
AThread.Connection.ReadBuffer (CommBlock, SizeOf(CommBlock));
order := commblock.Command;

UpdateFileStream:=TFileStream.Create(UpdateFileName,fmShareDenyRead);//把文件变成文件流
with AThread.Connection do
begin
try
if order='UPDATE' then //如果客户要求升级
begin
OpenWriteBuffer;
ClearWriteBuffer;
WriteStream(UpdateFileStream);//发送升级数据流
CloseWriteBuffer;
end;
finally
Disconnect;
UpdateFileStream.Free;
end;
end;

上面程序发送“update”更新命令是用writebuffer(),出错,如果用writeln,接收用readln()就没问题。

能不能在server端TCPSExecute事件里,既能用readln()接收命令,也用readbuffer()接收?
...全文
351 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjf1009 2004-10-15
  • 打赏
  • 举报
回复
TCPC.ReadStream(UpdateStream,-1,True);
UpdateStream.Seek(0, soFromBeginning);
DeCompressFiles('c:\',UpdateStream);

我是这样写的。第二行应该也是重置这个流的意思吧
cjf1009 2004-10-14
  • 打赏
  • 举报
回复
客户端发送不同的命令,有的用writeln发好,有的用writebuffer好。比如我的上面的程序,用writebuffer就毛病多多。
所以我想在服务器端的线程里同时用readln和readbuffer来接收。

或者,就上面的程序,我只能用writeln发送才不出错,换成writebuffer的就会出错。
yangyugw 2004-10-14
  • 打赏
  • 举报
回复
用readln就用writeln来对应
用readbuffer就用writebuffer来对应

为什么要求readln对应writebuffer呢
这是不合理的

如果你传输的是HEX码就应该使用writebuffer来实现了。
短歌如风 2004-10-14
  • 打赏
  • 举报
回复
我觉得用我写的方法用WriteStream接收方用ReadStream(UpdateStream,-1,false)读取的话应该是没有问题的,楼主是不是在接收到数据后没有用UpdateStream.Position := 0来重置这个流就去从流中读取数据了?
XXSingle 2004-10-14
  • 打赏
  • 举报
回复
或许就是 YANGYUGW(小杨) 所说,需要对应吧

UP
cjf1009 2004-10-13
  • 打赏
  • 举报
回复
自己顶一下
cjf1009 2004-10-13
  • 打赏
  • 举报
回复
是可以接收这个流了,但是解压缩的过程又出问题了。
DeCompressFiles(exepath,UpdateStream);代码在上面。
这个过程在用writeln的时候是没出错的。
halfdream 2004-10-13
  • 打赏
  • 举报
回复
plainsong 那样就是个很好的解决办法
cjf1009 2004-10-13
  • 打赏
  • 举报
回复
楼上大哥,那我这个问题到底该怎么解决呢?
halfdream 2004-10-13
  • 打赏
  • 举报
回复
procedure TIdTCPConnection.WriteLn(const AOut: string = '');
begin
Write(AOut + EOL);
end;

WIRTE是调用WriteBuffer实现的。

LF = #10;
CR = #13;
EOL = CR + LF;

writeln多发了回车换行符作为分隔符,

cjf1009 2004-10-13
  • 打赏
  • 举报
回复
现在我把这个流转换成文件的过程又出问题了,还是stream read error,就是这里
DeCompressFiles(exepath,UpdateStream);

该函数代码:
procedure DeCompressFiles(DirStr:String;DeskStream:TStream);
var
FileNum,i,CurrentPos:Integer;
FS:TMyFileStruct;
SourceStream,TempStream:TMemoryStream;
begin
TempStream:=TMemoryStream.Create;
SourceStream:=TMemoryStream.Create;
DeskStream.ReadBuffer(FileNum,SizeOf(FileNum)); //跟踪到这里出错。
CurrentPos:=FileNum*SizeOf(FS)+SizeOf(FileNum);
for i:=0 to FileNum-1 do
…………………………


可为什么用writeln()就一点都没有问题?
cjf1009 2004-10-13
  • 打赏
  • 举报
回复
不行了,再顶。
短歌如风 2004-10-12
  • 打赏
  • 举报
回复
idtcpclient1.ReadStream(UpdateStream,-1,false)
说明数据以流的长度开始(既不读所有数据又不指定长度)
而你在发送流时没有发送长度。应该把发送代码改为:
WriteStream(UpdateFileStream, True, True);
注意最后一个参数指明了是否要发送流的长度,缺省是False。
cjf1009 2004-10-12
  • 打赏
  • 举报
回复
着急呀,顶
cjf1009 2004-10-12
  • 打赏
  • 举报
回复
自己顶先

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧