Главная страница
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.021 c
2-1191990597
Al500
2007-10-10 08:29
2007.11.04
Подскажите пожалуйста, возможно ли неявно вызвать процедуру


15-1191262340
cber
2007-10-01 22:12
2007.11.04
В чём ошибка?


2-1192433468
Кирей
2007-10-15 11:31
2007.11.04
как выбрать самый новый файл по маске


3-1182526300
GanibalLector
2007-06-22 19:31
2007.11.04
Unable to complete network request to host "localhost"


2-1192101763
xayam
2007-10-11 15:22
2007.11.04
Как добавить символ перед