Главная страница
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.018 c
15-1190841455
Riply
2007-09-27 01:17
2007.11.04
Avast 4.7 and Visibroker


2-1191986806
Mariya
2007-10-10 07:26
2007.11.04
Скрыть button


2-1191937848
Сергей Красин
2007-10-09 17:50
2007.11.04
Стандартные диалоги


1-1187688195
Alex.rus
2007-08-21 13:23
2007.11.04
Как получить доступ к свойствам компонента расположенном на друго


11-1175002147
ElectriC
2007-03-27 17:29
2007.11.04
Липкие окна