Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Учет количества переданных байт [D6, WinXP]


iWorm ©   (2004-01-12 04:44:00) 

Здравствуйте,
проблема как вы уже поняли в индикации, если можно так выразиться, кол-ва переданный байт.. Я использую сокеты.
Вот код серверной части:

procedure TForm1.Button2Click(Sender: TObject);
var
 sStream : TMemoryStream;
begin
 sStream := TMemoryStream.Create;
 if not OpenDialog1.Execute then
   Exit;
 sStream.LoadFromFile(OpenDialog1.FileName);
 form1.Caption := inttostr(sStream.Size);
 ServerSocket1.Socket.Connections[0].SendStreamThenDrop(sStream);
end;

а вот обрботчик на клиентской:

var
 Form1: TForm1;
 fStream: TFileStream;

const
 MAX_BUF_SIZE = $4095;

.......

procedure TForm1.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 fStream:= TFileStream.Create('Receive.fil', fmCreate);
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
 count :Integer;
 buffer: Array [0..MAX_BUF_SIZE] of Char;
begin
 repeat
   Socket.Lock;
   count:= Socket.ReceiveBuf(buffer,SizeOf(buffer));
   if count > 0 then
     fStream.WriteBuffer(buffer,count);
   Socket.Unlock;
 until (count <= 0);
 Edit1.text := (IntToStr(fStream.Size));
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 fStream.Free;
end;


как видите, если еще на клиентской чати все просто то на серверной мне не понятно как это по человечески сделать. Ну не отсылать же клиенту инфу о том скоко ему пришло.. Наверняка есть способ поинтересней;)
Заранее спасибо


iWorm   (2004-01-16 02:18:00) [1]

Verg
я не силен в делфи, но вы все правильно поняли:)
Читаю ваш код и понимаю, как реально глюканул, ведь все так просто.
Спасибо:)


Verg   (2004-01-15 07:44:00) [2]

Насколько я понял, нужно сделать показ/учет прогресса передачи.

Если "влоб", то я определил бы класс - наследник TFileStream у которого перекрыл бы виртуальный метод Read

TMyFileStream = class(TFileStream)
public
 function Read(var Buffer; Count: Longint): Longint; override;
end;

implementation

function TMyFileStream.Read(var Buffer; Count: Longint): Longint;
begin
 result:=inherited Read(Buffer, Count);

 ProgressBar1.Position := Position;
end;

// Перепишем твою ф-цию Button2Click :

procedure TForm1.Button2Click(Sender: TObject);
var
sStream : TMyFileStream;
begin
if not OpenDialog1.Execute then
  Exit;
sStream := TMyFileStream.Create(OpenDialog1.FileName, fmOpenRead );
ProgressBar1.Max      :=  sStream.Size;
ProgressBar1.Position :=  0;

ServerSocket1.Socket.Connections[0].SendStreamThenDrop(sStream);
end;


iWorm   (2004-01-15 05:33:00) [3]

to Palladit
а на отправляющем сокете как сделать??


Palladin   (2004-01-13 13:56:00) [4]

ага... count складывать...


Наверх

Титульная страница Поиск, карта сайта Написать письмо