首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于 ClientSocket和ServerSocket有关问题

2012-09-03 
关于 ClientSocket和ServerSocket问题.客户端主程序如下, files: TMemoryStream 已经创建.procedure Recei

关于 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事件

热点排行