sock通讯(200分)

  • 主题发起人 主题发起人 jerjoan
  • 开始时间 开始时间
J

jerjoan

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个问题想请教在座的高手:在Delphi中socket一次传输的数据流是不是有大小限制,如果有的话最大是多少,不知哪位可以帮忙写一个用socket分包传送文件的例子,谢谢!
 
好像是64K
 
Sorket本质是流式传送的
你只管发送接收就行
 
socket以流式传输数据没错,可是它每次传送的数据是有限制的,传送方的一次数据传送,可能会多次触发接受方的onread事件呀。
 
以流的方式传送的话就传一次,流大的话就得接收好几次.所以要想接收完整的流就得在传送流之前先计算流的大小,传用流的大小再发流,让客户端知道流的大小后,把之后接收的流都合并起来,直到大小等于原流的大小为止.
 
我给你一段我接收流文件的例子,你可以参考一下:
private (type form部分定义变量)
Buffer:array[0..9999] of char ;
SerStatus:TSerstatus;
B_FileLen:integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
Serstatus:=csIdle; //初始化serstatus为csIdle
end;

procedure TForm1.SerSockClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
StrIn:string;
B_stream:TmemoryStream;
B_StrLen,B_position:integer;
Time1:cardinal;
begin
case SerStatus of
csIdle:
begin
Socket.ReCeiveBuf(Buffer,6); //我所传过来的文件的头6位是文件信息而非内容
Strin:=Copy(Buffer,1,6);
if Copy(Strin,1,4)='WJJS' then //取文件住息中头四位
begin
SerStatus:=CsLeng;
B_FileLen:=StrToInt(Copy(Strin,5,2)); //取文件名长度
end;
end;
csLeng:
begin
Socket.ReceiveBuf(Buffer,B_FileLen); //这些是文件名信息
Strin:=Copy(Buffer,1,B_FileLen); //取文件名
if copy(Strin,1,2)='Db' then
begin
SerStatus:=csFile; //设置状态以便取内容
B_CanHttp:=False;
Lsb_Js.Items.Add('正在接收文件'+StrIn+'... '+TimeToStr(Time));
end;
end;
csFile:
begin
B_Stream:=TMemoryStream.Create;
B_position:=10000;
While True do
begin
while Socket.ReceiveLength<10000 do
begin
if Socket.ReceiveLength=B_position then break;
B_position:=Socket.ReceiveLength ;
Time1:=GetTickCount;
While GetTickCount-Time1<200 do;
end;
B_StrLen:=Socket.ReceiveBuf(Buffer,Sizeof(Buffer));
if B_StrLen<=0 then
break
else B_Stream.Write(Buffer,B_StrLen);
end;
B_Stream.Position:=0;
B_Stream.SaveToFile(ExtractFilePath(Application.ExeName)+'Dbbb.mdb');
Lsb_Js.Items.Add('文件接收结束,正在保存文件... '+TimeToStr(Time));
B_Stream.Free;
SerStatus:=CsIdle;
Socket.SendText('RECOK!');
B_CanHttp:=True;
if copy(Strin,1,4)='Dbbb' then P_SaveSj
else P_SaveFile;
end;
end;
end;

代码里的一些控件无法一一指出,你看明白就行了。
 
和操作系统有关WINDOWS限定是64K ,数据包大了可以让你DOWN机,嘿嘿。
 
CPU: PIII 670
我试验过了,最大17.5K.
是调用socket32.dll最底层的发送函数,其他所有的控件(delphi,vc等)最终都
调用它了.
 
谢谢我接受答案了.
 
接受答案了.
 
后退
顶部