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

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

Сокеты [D6]


Олег_Иванов ©   (2007-08-22 07:56:00) 

Уважаемые мастера.
Почему при этом коде нельзя загружать файлы более 15 МБ.

//Клиент
procedure TForm1.FormCreate(Sender: TObject);
begin
ClientSocket1.Open; // Открываем сокет
Receive := false; // Режим клиента - приём команд
MS := TMemoryStream.Create;
end;

procedure TForm1.Writing(Text: string);
begin
if MS.Size < Size then // Если принято байт меньше размера файла, то...
MS.Write(Text[1], Length(Text)); // Записываем в буфер
// Выводим прогресс закачки файла
ProgressBar1.Position := MS.Size*100 div Size;
StatusBar1.SimpleText := 'Принято '+IntToStr(MS.Size)+' из '+IntToStr(Size);
if MS.Size = Size then // Если файл принят, то...
begin
Receive := false; // Переводим клиента в нормальный режим
MS.Position := 0; // Переводим каретку в начало буфера
MS.SaveToFile(Name); // Сохраняем файл
ClientSocket1.Socket.SendText('end'); // Посылаем команду "end", то есть файл принят
MS.Free; // Убиваем буфер
StatusBar1.SimpleText := 'Файл принят';
end;
Application.ProcessMessages;
if ProgressBAr1.Position = 100 then
ProgressBAr1.Position:=0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ClientSocket1.Close; // Закрываем сокет
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
  StatusBar1.SimpleText := 'Соединение установлено';
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
  StatusBar1.SimpleText := 'Соединение не установлено';
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
  Rtext: string; // Принятый текст
begin
  Rtext := Socket.ReceiveText;
  if Receive then
  begin // Если клиент в режиме приёма файла, то...
   //  ShowMessage(Inttostr(MS.Size));
     Writing(RText); // Записываем данные в буфер
  end
  else // Если клиент не в режиме приёма файла, то...
  if Copy(Rtext, 0, Pos('#', Rtext) -1) = 'file' then // Если это файл, то...
  begin  // Создаём буфер для файла
     Delete(Rtext, 1, Pos('#', Rtext)); // Определяем имя файла
     Name := Copy(Rtext, 0, Pos('#', Rtext) -1); // Определяем имя файла
//      Name:='c:\sdd.reg';
     Delete(Rtext, 1, Pos('#', Rtext)); // Определяем размер файла
     Size := StrToInt(Copy(Rtext, 0, Pos('#', Rtext) -1)); // Определяем размер файла
     Delete(Rtext, 1, Pos('#', Rtext)); // Удаляем последний разделитель
     Label1.Caption := 'Размер файла: '+IntToStr(Size)+' байт'; // Выводим размер файла
     Label2.Caption := 'Имя файла: '+Name; // Выводим имя файла
     Receive := true; // Переводим сервер в режим приёма файла
     Writing(RText); // Записываем данные в буфер
end;
end;

//Сервер
var
 Form1: TForm1;
 MS: TMemoryStream; // Буфер для файла
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Open; // Открываем сокет
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ServerSocket1.Close; // Закрываем сокет
end;

procedure TForm1.Button1Click(Sender: TObject);
var

Size: integer;

P: ^Byte;

begin
if not OpenDialog1.Execute then Exit;
Edit1.Text:=OpenDialog1.FileName;
MS := TMemoryStream.Create; // Создаём буфер для файла
MS.LoadFromFile(Edit1.Text); // Загружаем файл в буфер
// Посылаем информацию о файл (команда # название # размер)
ServerSocket1.Socket.Connections[0].SendText('file#'+Edit1.Text+'#'+IntToStr(MS.Size)+'#');
MS.Position := 0; // Переводим каретку в начало файла
P := MS.Memory; // Загружаем в переменную "P" файл
Size := ServerSocket1.Socket.Connections[0].SendBuf(P^, MS.Size); // Посылаем файл
// Выводим прогресс
ProgressBar1.Position := Size*100 div MS.Size;
StatusBar1.SimpleText := 'Отправлено '+IntToStr(Size)+' из '+IntToStr(MS.Size)+' байт';
Application.ProcessMessages;
if ProgressBAr1.Position = 100 then
ProgressBAr1.Position:=0;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
begin
if Socket.ReceiveText = 'end' then // Если клиент принял файл, то...
begin
StatusBar1.SimpleText := 'Клиент принял файл';
MS.Free; // Убиваем буфер
end;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'Соединение установлено';
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'Соединение не установлено';
end;

procedure TForm1.ServerSocket1ClientError(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
  ErrorCode:=0;
 
end;


Сергей М.   (2007-08-22 08:26:00) [1]


> как произвести анализ SendBuf


А справку по этому поводу ты уже проштудировал ?


Олег_Иванов   (2007-08-22 08:25:00) [2]

А как произвести анализ SendBuf


Сергей М.   (2007-08-22 08:06:00) [3]

Где у тебя анализ результата вызова функциональногометода SendBuf ?
Почему не воспользоваться методом SendStream ?


Наверх

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