T
tp168
Unregistered / Unconfirmed
GUEST, unregistred user!
用tclientsocket和tserversocket的ctnonblocking方式实现文件从client->server
的传输的问题,我的设计思路是client端每发一个包,server端都要给一个响应是
否成功,收到成功响应后才继续发送后续包,否则尝试发送三次,但是出现以下问
题不知如何解决,请各位大虾帮忙一下,多谢了!
const _bbs='send_file_test11'
每个包结构为16位包标识(固定为_bbs)+4位(如下)+包数据(长度不定)
client端发的包(其中vctosave,vdsaveinfo,vcfirstbuf,vclastbuf为必发的包)
vctosave:请求server端上传文件(无包数据)
vcsaveinfo:发送文件信息-》vcsaveinfo+包数据(文件名称|文件时间|文件大小)
vcfirstbuf:
头一个包-》包数据长度:如果文件大小<datalen,为文件大小,
如果文件大小>=datalen,为datalen长的文件流(datalen大小可配置)
vccommonbuf:中间的包-》包数据为datalen长的文件流
vclastbuf:最后的包-》包数据长度为剩余文件流大小
server端发的包
vsready:已准备好
vssaveinfook:存文件信息成功
vsfirstbufok:存第一个包成功
vscommonbufok:存中间包成功
vssaveok:上传文件成功
问题在于:
1。client端发送一个包后,怎样才能判断server端是否响应超时,
以便尝试再发送;
2。client端发送一个包后,按造delphi的onread的原理,可能会激发
server端的多个onread事件,我怎么写server端的读数据的过程;
3。server端也应具有判断client端是否响应超时的功能。
我的程序大概如下:
unit client;
tform1.button1onclick(...)
begin
client1.open;
end;
tform1.client1connect(...)
begin
socket.sendbuf(_bbs+vcsave,20);
end;
tform1.client1tread(...)
var
getbuf,sendbuf:array [1..datalen+20] of char;
len,sendsize:integer;
begin
len:=socket.receivebuf(getbuf,datalen+20);
sendsize:=0;
if len>=20 then
begin
处理包(存文件流,处理出响应包sendbuf,sendsize);
end;
if sendsize>0 then socket.sendbuf(sendbuf,sendsize);
end;
unit server;
tform1.server1read(...)
var
getbuf,sendbuf:array [1..datalen+20] of char;
len,sendsize:integer;
begin
len:=socket.receivebuf(getbuf,datalen+20);
sendsize:=0;
if (len>=20)and(copy(getbuf,1,20)=_bbs) then
//问题就出在这里,如果client端发了一个包,server端激发了三个onread
事件(假设),这是不是判断len>=20不是行不通了,因为其实包还没收完整,
要等待三个onread事件后才能处理,但是却怎么知道还没后续onread事件,
看了论坛中的相关资料,找到说可以用二级缓存的方法实现,由于我的数据
包不定长,只能通过加包头和包尾解决,但是应该如何编码,如果包内容里
也包括该标识又该如何解决呢?
begin
处理包(处理出sendbuf,sendsize);
end;
if sendsize>0 then socket.sendbuf(sendbuf,sendsize);
end;
的传输的问题,我的设计思路是client端每发一个包,server端都要给一个响应是
否成功,收到成功响应后才继续发送后续包,否则尝试发送三次,但是出现以下问
题不知如何解决,请各位大虾帮忙一下,多谢了!
const _bbs='send_file_test11'
每个包结构为16位包标识(固定为_bbs)+4位(如下)+包数据(长度不定)
client端发的包(其中vctosave,vdsaveinfo,vcfirstbuf,vclastbuf为必发的包)
vctosave:请求server端上传文件(无包数据)
vcsaveinfo:发送文件信息-》vcsaveinfo+包数据(文件名称|文件时间|文件大小)
vcfirstbuf:
头一个包-》包数据长度:如果文件大小<datalen,为文件大小,
如果文件大小>=datalen,为datalen长的文件流(datalen大小可配置)
vccommonbuf:中间的包-》包数据为datalen长的文件流
vclastbuf:最后的包-》包数据长度为剩余文件流大小
server端发的包
vsready:已准备好
vssaveinfook:存文件信息成功
vsfirstbufok:存第一个包成功
vscommonbufok:存中间包成功
vssaveok:上传文件成功
问题在于:
1。client端发送一个包后,怎样才能判断server端是否响应超时,
以便尝试再发送;
2。client端发送一个包后,按造delphi的onread的原理,可能会激发
server端的多个onread事件,我怎么写server端的读数据的过程;
3。server端也应具有判断client端是否响应超时的功能。
我的程序大概如下:
unit client;
tform1.button1onclick(...)
begin
client1.open;
end;
tform1.client1connect(...)
begin
socket.sendbuf(_bbs+vcsave,20);
end;
tform1.client1tread(...)
var
getbuf,sendbuf:array [1..datalen+20] of char;
len,sendsize:integer;
begin
len:=socket.receivebuf(getbuf,datalen+20);
sendsize:=0;
if len>=20 then
begin
处理包(存文件流,处理出响应包sendbuf,sendsize);
end;
if sendsize>0 then socket.sendbuf(sendbuf,sendsize);
end;
unit server;
tform1.server1read(...)
var
getbuf,sendbuf:array [1..datalen+20] of char;
len,sendsize:integer;
begin
len:=socket.receivebuf(getbuf,datalen+20);
sendsize:=0;
if (len>=20)and(copy(getbuf,1,20)=_bbs) then
//问题就出在这里,如果client端发了一个包,server端激发了三个onread
事件(假设),这是不是判断len>=20不是行不通了,因为其实包还没收完整,
要等待三个onread事件后才能处理,但是却怎么知道还没后续onread事件,
看了论坛中的相关资料,找到说可以用二级缓存的方法实现,由于我的数据
包不定长,只能通过加包头和包尾解决,但是应该如何编码,如果包内容里
也包括该标识又该如何解决呢?
begin
处理包(处理出sendbuf,sendsize);
end;
if sendsize>0 then socket.sendbuf(sendbuf,sendsize);
end;