关于 ClientSocket和ServerSocket问题.
客户端主程序如下, files: TMemoryStream 已经创建.
procedure ReceiveFile;
var
FileNames: TFileNames; //存放文件名;
i, L, FZ, RecLen: integer;
buf: array[0..8191] of char;
begin
L := Length(FileNames);
for i := 0 to L - 1 do
begin
ClientSocket1.Socket.SendText('3|' + FileNames[I]);
Fz := StrToInt(ClientSocket1.Socket.ReceiveText); {运行时候会在这个地方报错 错误内容是ReceiveText取得'' 导致StrToInt报错, 问题是单步运行到此处基本上不会报错,直接运行时候就会报以上错误,请高手指点什么地方的原因.}
if Fz > 0 then
begin
ClientSocket1.Socket.SendText('4|' + FileNames[I]);
while True do
begin
RcLen := ClientSocket1.Socket.ReceiveLength;
ClientSocket1.Socket.ReceiveBuf(buf, RecLen);
files.Write(buf, RecLen);
if files.Size >= FZ then
begin
files.Position := 0;
files.SaveToFile('c:\' + Trim(FileNames[I]);
files.Clear;
L := 0;
Break;
end;
end;
end
end;
end;
服务器主程序如下;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
sMsg :string;
FileName: string;
fs: Cardinal;
FileStream: TFileStream;
begin
EnterCriticalSection(csRequest);
try
sMsg := Socket.ReceiveText;
sClientVersion := sMsg;
if sMsg[1] = '3' then
begin
FileName := Copy(sMsg, 3, Length(sMsg));
FileStream := TFileStream.Create(CurrentPath + Trim(FileName), fmOpenRead );
fs := FileStream.Size;
Socket.SendText(Inttostr(fs));
FileStream.Free;
end;
if sMsg[1] = '4' then
begin
FileName := Copy(sMsg, 3, Length(sMsg));
FileStream := TFileStream.Create(CurrentPath + Trim(FileName), fmOpenRead );
FileStream.Position := 0;
Socket.sendStream(FileStream);
end;
finally
LeaveCriticalSection(csRequest);
end;
end;
谢谢
[解决办法]
是不是服务端发送的流没接收完,SOCKET类似流操作,你要检查一下字节顺序。
[解决办法]
接收不是这么写的,接收与发送要分开来
ReceiveFile函数中ReceiveText,ReceiveBuf等等,要写在ClientSocket的onRead事件中(或用线程监听)
而不是和SendText挤在一起。
比如下面Button1是发送数据:
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('Hello');
memo1.lines.add(ClientSocket1.Socket.ReceiveText); //这句在这里没用,不会收到任何数据
end;
因为Button1Click中代码执行结束后才会触发ServerSocket1ClientRead事件
正确写法是把ClientSocket1.Socket.ReceiveText写在ClientSocket1Read事件