传送端:
procedure Tf_Main.rb_upClick(Sender: TObject);
var
nID:integer;
nSize:Integer;
n:Integer;
p:pByte;
data:TmemoryStream;
begin
data:=TmemoryStream.Create;
try
data.LoadFromFile(extractfilepath(application.EXEName)+'xfd.tmp');
with ClientSocket1 do
begin
open;
nSize:=data.Size;
p:=data.Memory;
while (nSize>0) do
begin
n:=nSize;
if (n>8192) then
n:=8192;
n:=Socket.SendBuf(p^,n);
//
if (n<=0) then
Raise Exception.Create('发送文件失败!');
Inc(p,n);
Dec(nSize,n);
end;
close;
end;
except on e:Exception do
showmessage(e.Message);
end;
data.Free;
end;接收端:
procedure Tf_Server.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
var
nID:integer;
nSize:Integer;
n:Integer;
p:pByte;
data:TmemoryStream;
begin
data:=TmemoryStream.Create;
GetMem(p,8192);
try
while (nSize>0) do
begin
n:=nSize;
if (n>8192) then
n:=8192;
n:=Socket.ReceiveBuf(P^,n);
if (n<=0) then
Raise Exception.Create('');
data.Write(p^,n);
Dec(nSize,n);
end;
data.SaveToFile(extractfilepath(application.EXEName)+'xfd.tmp');
except
end;
FreeMem(p);
data.Free;
end;每次都是提示:发送文件失败!
procedure Tf_Main.rb_upClick(Sender: TObject);
var
nID:integer;
nSize:Integer;
n:Integer;
p:pByte;
data:TmemoryStream;
begin
data:=TmemoryStream.Create;
try
data.LoadFromFile(extractfilepath(application.EXEName)+'xfd.tmp');
with ClientSocket1 do
begin
open;
nSize:=data.Size;
p:=data.Memory;
while (nSize>0) do
begin
n:=nSize;
if (n>8192) then
n:=8192;
n:=Socket.SendBuf(p^,n);
//
if (n<=0) then
Raise Exception.Create('发送文件失败!');
Inc(p,n);
Dec(nSize,n);
end;
close;
end;
except on e:Exception do
showmessage(e.Message);
end;
data.Free;
end;接收端:
procedure Tf_Server.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
var
nID:integer;
nSize:Integer;
n:Integer;
p:pByte;
data:TmemoryStream;
begin
data:=TmemoryStream.Create;
GetMem(p,8192);
try
while (nSize>0) do
begin
n:=nSize;
if (n>8192) then
n:=8192;
n:=Socket.ReceiveBuf(P^,n);
if (n<=0) then
Raise Exception.Create('');
data.Write(p^,n);
Dec(nSize,n);
end;
data.SaveToFile(extractfilepath(application.EXEName)+'xfd.tmp');
except
end;
FreeMem(p);
data.Free;
end;每次都是提示:发送文件失败!
TClientSocket的ClientType:=ctBlocking;ClientSocket能正确连接到ServerScoket如果在n:=Socket.SendBuf(p^,n);后加上showmessage(inttostr(n));需要每次点击对话框,最终是可以正常接收的我不知道问题出在哪儿,请各位大侠指点一下
nSize没有被赋值
加上
nSize:=Socket.ReceiveLength;
nSize:=data.Size;
if (socket.SendBuf(nSize,SizeOf(nSize)) <> SizeOf(nSize)) then
Raise Exception.Create('发送文件大小错误!');
p:=data.Memory;
其实我的代码是按照delphi6高级编程中的例程输入的,我所迷惑的是:
如果在n:=Socket.SendBuf(p^,n);后加上showmessage(inttostr(n));需要每次点击对话框,最终是可以正常接收的