Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.04;
Скачать: CL | DM;

Вниз

Сокеты   Найти похожие ветки 

 
Олег_Иванов   (2007-08-22 07:56) [0]

Уважаемые мастера.
Почему при этом коде нельзя загружать файлы более 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:06) [1]

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


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

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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2007.11.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
11-1171786815
Ned
2007-02-18 11:20
2007.11.04
Hint s


2-1192187209
kyn66
2007-10-12 15:06
2007.11.04
Окно не раскрывается полностью


15-1191572000
Separator
2007-10-05 12:13
2007.11.04
Конвертация в pdf


11-1175375566
Nsp
2007-04-01 01:12
2007.11.04
How to drag Form или как таскать форму


2-1192280257
AlexanderMS
2007-10-13 16:57
2007.11.04
Проблема с курсором на Edit е.