张无忌,听说你很历家,有人向我推荐向你请教这个问题,请进(69分)

  • 主题发起人 主题发起人 yourkeychen
  • 开始时间 开始时间
Y

yourkeychen

Unregistered / Unconfirmed
GUEST, unregistred user!
我将服务端的目录开成了一棵,然后通过Socket将这棵目录传输到客户端(也可将这棵存为文件TreeView.SaveToFile后再传都可以),最初我用的是发送结点字串的形式,直接将TreeView形成字串后发送过去,当目录数较小的时候客户端没有问题,但当目录树大的时候,就接收不正确了。我知道需要自己去控制流量,但是具体怎么实现?怎么去做?我就不清楚,我没有这方面的经验,能不能请你百忙抽个空给我示例代码呢?我现实非常急的需要解决这个问题,我已经在大富翁,CSDN上逛了好久了,一直没有找到人帮忙解决,只好来麻烦你了。
我为了问这个问题分已经用的差不多了,剩下的69分我全部给你了。不要嫌少哦!!
 
TCP/IP会自动封包,当你的数据过大的时候,会自动封成多个TCP数据包发送,或许你只是截取了一个封包的TCP数据后,就开始解析字符串,那么必定会出现错误,你需要在发送时候指定一个结束符,然后在客户端接受到这个结束符以后,才将之前接收到的数据拼合,形成新的字符串以后,再去解析,就会正确了.
 
楼上兄弟,你可不可以告诉我如何确认结束并去解析?
我是新手,知道道理,却不知道从何入手,请多指教。说的详细一点,
最好是有示例源码说明,谢谢。
 
我有代码,不过在备份光盘,我简单说明:
服务端:
//假设ASendStr是要传输的字符串,即你的listview的组合字符串
procedure Send(ASendStr: string);
var
sTmp:string;
begin
sTmp := ASendStr + #12#13#14#15#16#17#18;
Socket.Send(sTmp);
end;

客户端:
var
sTmp: string;
procedure Receive(ARevStr: string);
begin
sTmp := sTmp + ArevStr;
if FindStr(ARevStr, #12#13#14#15#16#17#18) = true then
//说明:FindStr为搜索字符串函数,我忘记了,暂时胡乱替代
//找到这个#12#13#14#15#16#17#18串后,就可以把这个串之前前的字符串取出来
//例如'ABC'+#12#13#14#15#16#17#18+'DE',你取到就是ABC
//加上Sockt每次获取的字符串,就成为完整的一个字符串,你就可以解析了.
begin
FXString(sTmp); //这里就是你的分析函数
sTmp := '';
sTmp := 这里是#12#13#14#15#16#17#18之后的数据;
//例如'ABC'+#12#13#14#15#16#17#18+'DE',你取到的就是'DE'
end;
end;
//注意,在你的sockt控件的接收方法里面调用Receive即可.
 
to:天若无痕
把你的代码发给我吧,我的邮箱是:yourkeychen@163.net
如果比较大,约个时间传也行
越快越好啊,我一直等这个问题解决呢,多谢多谢了,真的太谢谢了
 
好,我找出来就给你,今天晚上或者明天晚上给你,我现在办公室.无法给你,代码在我的备份光盘上.
 
你是不是客户端接收完后总字节数与服务器发送的字节数不一样(通常是比服务器发送的少)?你的文件有多大?我发送3M的可执行文件没有任何问题。关键在于发送和接收时的处理。
 
那最好是今天晚上,我再晚都可以等。我着急的很
 
To:ego
你可告诉我你是怎么做的吗?可不可以把你的源码也给我看看?
分我都给,分我不在乎,我有多少给多少,虽然我不多,我只希望能把问题解决
我的那个接收我都不知道是收多了还是收少了,反正不停的报错,在线等你答复。
To:天若无痕,
你的也今天晚上发给我吧,我今天就多谢你们了,我就是加通宵也要把它弄明白
谢谢你们了。
 
to: ego
我的MSN是:yourkeychen@hotmail.com
我的QQ是:18832809
 
这个问题已获他人帮助解决
请版主帮我收回分数
 
后退
顶部