1.
| Код | procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var s: String; begin while Socket.ReceiveLength>0 do s := s+socket.ReceiveText; memo1.Lines.Add(socket.ReceiveText); end;
|
2. Каким-то образом нужно определять, что файл передан полностью. Если сразу после передачи клиент отключается, то проблем нет. В обработчике OnDisconnect определяем, что файл передан. Если же такой вариант не подходит, необходимо в начале передачи(перед началом передачи данных файла) передать размер файла. Сервер должен получить этот размер и при приеме считать длину принятых данных.
Добавлено @ 19:15 Вот примерчик - с одним участником разбирались.
Клиент:
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp, ExtCtrls;
type TForm1 = class(TForm) CS: TClientSocket; Button1: TButton; Button2: TButton; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure CSRead(Sender: TObject; Socket: TCustomWinSocket); private Stop:boolean; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin CS.Port:=666; CS.Host:='127.0.0.1'; CS.Open; end;
procedure TForm1.Button2Click(Sender: TObject); begin Stop:=True; end;
procedure TForm1.Timer1Timer(Sender: TObject); var DC:HDC; BMP:TBitmap; SBMP:TMemoryStream; Len: Int64; begin if Timer1.Tag=1 then Exit; Timer1.Tag := 1; SBMP:=TMemoryStream.Create; BMP:=TBitmap.Create; DC:=GetDC(0); BMP.Height:=0; BMP.Width:=0; BMP.Height:=500; BMP.Width:=500; BitBlt(BMP.Canvas.Handle,0,0,BMP.Width,BMP.Height,DC,0,0,SrcCopy); BMP.SaveToStream(SBMP); BMP.Free; Len := SBMP.Size; CS.Socket.SendBuf(Len,SizeOf(Int64)); SBMP.Position:=0; CS.Socket.SendStream(SBMP); end;
procedure TForm1.CSRead(Sender: TObject; Socket: TCustomWinSocket); begin Socket.ReceiveText; Timer1.Tag := 0; end;
end.
|
Сервер:
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ScktComp;
type
TState=(stNone,stData); TForm1 = class(TForm) Image1: TImage; SS: TServerSocket; procedure FormCreate(Sender: TObject); procedure SSClientRead(Sender: TObject; Socket: TCustomWinSocket); private SBMP:TMemoryStream; public { Public declarations } end;
var Form1: TForm1; State: TState=stNone; Msg:string; Len: Int64; CountReceived: Int64;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin SS.Port:=666; SS.Open; end;
procedure TForm1.SSClientRead(Sender: TObject; Socket: TCustomWinSocket); begin Msg:= Msg+Socket.ReceiveText;
while Msg<>'' do begin case State of stNone: begin if Length(Msg)<SizeOf(Int64) then Exit; State := stData; Move(Msg[1],Len,SizeOf(int64)); Delete(Msg,1,SizeOf(int64)); CountReceived := 0; SBMP:=TMemoryStream.Create; end; stData: begin CountReceived := CountReceived+SBMP.Write(Msg[1],Length(Msg)); Msg := ''; if CountReceived=Len then begin State := stNone; SBMP.Position:=0; Image1.Picture.Bitmap.Height:=100; Image1.Picture.Bitmap.Width:=100; Image1.Picture.Bitmap.LoadFromStream(SBMP); SBMP.Free; Socket.SendText('o'); end; end; end; end; end;
end.
|
|