Форум: "Основная";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
ВнизСокеты Найти похожие ветки
← →
Олег_Иванов (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c